PromiseT.cs
59 lines
| 3.4 KiB
| text/x-csharp
|
CSharpLexer
/ Implab / PromiseT.cs
|
|
r119 | using System; | ||
| using System.Diagnostics; | ||||
|
|
r144 | using Implab.Parallels; | ||
|
|
r119 | |||
| namespace Implab { | ||||
| /// <summary> | ||||
| /// Класс для асинхронного получения результатов. Так называемое "обещание". | ||||
| /// </summary> | ||||
| /// <typeparam name="T">Тип получаемого результата</typeparam> | ||||
| /// <remarks> | ||||
| /// <para>Сервис при обращении к его методу дает обещаиние о выполнении операции, | ||||
| /// клиент получив такое обещание может установить ряд обратных вызово для получения | ||||
| /// событий выполнения обещания, тоесть завершения операции и предоставлении результатов.</para> | ||||
| /// <para> | ||||
| /// Обещение может быть как выполнено, так и выполнено с ошибкой. Для подписки на | ||||
| /// данные события клиент должен использовать методы <c>Then</c>. | ||||
| /// </para> | ||||
| /// <para> | ||||
| /// Сервис, в свою очередь, по окончанию выполнения операции (возможно с ошибкой), | ||||
| /// использует методы <c>Resolve</c> либо <c>Reject</c> для оповещения клиетна о | ||||
| /// выполнении обещания. | ||||
| /// </para> | ||||
| /// <para> | ||||
| /// Если сервер успел выполнить обещание еще до того, как клиент на него подписался, | ||||
| /// то в момент подписки клиента будут вызваны соответсвующие события в синхронном | ||||
| /// режиме и клиент будет оповещен в любом случае. Иначе, обработчики добавляются в | ||||
| /// список в порядке подписания и в этом же порядке они будут вызваны при выполнении | ||||
| /// обещания. | ||||
| /// </para> | ||||
| /// <para> | ||||
| /// Обрабатывая результаты обещания можно преобразовывать результаты либо инициировать | ||||
| /// связанные асинхронные операции, которые также возвращают обещания. Для этого следует | ||||
| /// использовать соответствующую форму методе <c>Then</c>. | ||||
| /// </para> | ||||
| /// <para> | ||||
| /// Также хорошим правилом является то, что <c>Resolve</c> и <c>Reject</c> должен вызывать | ||||
| /// только инициатор обещания иначе могут возникнуть противоречия. | ||||
| /// </para> | ||||
| /// </remarks> | ||||
|
|
r144 | public class Promise<T> : AbstractPromise<T>, IDeferred<T> { | ||
|
|
r119 | |||
|
|
r144 | public static IPromise<T> FromResult(T value) { | ||
|
|
r146 | return new SuccessPromise<T>(value); | ||
|
|
r119 | } | ||
|
|
r144 | public static IPromise<T> FromException(Exception error) { | ||
|
|
r203 | return new FailedPromise<T>(error); | ||
|
|
r119 | } | ||
| public virtual void Resolve(T value) { | ||||
|
|
r144 | SetResult(value); | ||
|
|
r119 | } | ||
| public void Reject(Exception error) { | ||||
| SetError(error); | ||||
| } | ||||
| } | ||||
| } | ||||
