Mercurial > pub > ImplabNet
annotate Implab/PromiseT.cs @ 246:5aa9cfbe56c3 v3
missing files
| author | cin |
|---|---|
| date | Fri, 26 Jan 2018 11:19:38 +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 } |
