Mercurial > pub > ImplabNet
annotate Implab/PromiseT.cs @ 243:b1e0ffdf3451 v3
working on promises
author | cin |
---|---|
date | Wed, 24 Jan 2018 19:24:10 +0300 |
parents | 4d9830a9bbb8 |
children |
rev | line source |
---|---|
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) { |
203
4d9830a9bbb8
Added 'Fail' method to RunnableComponent which allows component to move from
cin
parents:
146
diff
changeset
|
48 return new FailedPromise<T>(error); |
119 | 49 } |
50 | |
51 public virtual void Resolve(T value) { | |
144 | 52 SetResult(value); |
119 | 53 } |
54 | |
55 public void Reject(Exception error) { | |
56 SetError(error); | |
57 } | |
58 } | |
59 } |