119
|
1 using System;
|
|
2 using System.Diagnostics;
|
144
|
3 using Implab.Parallels;
|
119
|
4
|
|
5 namespace Implab {
|
|
6
|
|
7 /// <summary>
|
|
8 /// Класс для асинхронного получения результатов. Так называемое "обещание".
|
|
9 /// </summary>
|
|
10 /// <typeparam name="T">Тип получаемого результата</typeparam>
|
|
11 /// <remarks>
|
|
12 /// <para>Сервис при обращении к его методу дает обещаиние о выполнении операции,
|
|
13 /// клиент получив такое обещание может установить ряд обратных вызово для получения
|
|
14 /// событий выполнения обещания, тоесть завершения операции и предоставлении результатов.</para>
|
|
15 /// <para>
|
|
16 /// Обещение может быть как выполнено, так и выполнено с ошибкой. Для подписки на
|
|
17 /// данные события клиент должен использовать методы <c>Then</c>.
|
|
18 /// </para>
|
|
19 /// <para>
|
|
20 /// Сервис, в свою очередь, по окончанию выполнения операции (возможно с ошибкой),
|
|
21 /// использует методы <c>Resolve</c> либо <c>Reject</c> для оповещения клиетна о
|
|
22 /// выполнении обещания.
|
|
23 /// </para>
|
|
24 /// <para>
|
|
25 /// Если сервер успел выполнить обещание еще до того, как клиент на него подписался,
|
|
26 /// то в момент подписки клиента будут вызваны соответсвующие события в синхронном
|
|
27 /// режиме и клиент будет оповещен в любом случае. Иначе, обработчики добавляются в
|
|
28 /// список в порядке подписания и в этом же порядке они будут вызваны при выполнении
|
|
29 /// обещания.
|
|
30 /// </para>
|
|
31 /// <para>
|
|
32 /// Обрабатывая результаты обещания можно преобразовывать результаты либо инициировать
|
|
33 /// связанные асинхронные операции, которые также возвращают обещания. Для этого следует
|
|
34 /// использовать соответствующую форму методе <c>Then</c>.
|
|
35 /// </para>
|
|
36 /// <para>
|
|
37 /// Также хорошим правилом является то, что <c>Resolve</c> и <c>Reject</c> должен вызывать
|
|
38 /// только инициатор обещания иначе могут возникнуть противоречия.
|
|
39 /// </para>
|
|
40 /// </remarks>
|
144
|
41 public class Promise<T> : AbstractPromise<T>, IDeferred<T> {
|
119
|
42
|
144
|
43 public static IPromise<T> FromResult(T value) {
|
146
|
44 return new SuccessPromise<T>(value);
|
119
|
45 }
|
|
46
|
144
|
47 public static IPromise<T> FromException(Exception error) {
|
|
48 var p = new Promise<T>();
|
|
49 p.Reject(error);
|
|
50 return p;
|
119
|
51 }
|
|
52
|
|
53 public virtual void Resolve(T value) {
|
144
|
54 SetResult(value);
|
119
|
55 }
|
|
56
|
|
57 public void Reject(Exception error) {
|
|
58 SetError(error);
|
|
59 }
|
|
60 }
|
|
61 }
|