Mercurial > pub > ImplabNet
diff Implab/Promise.cs @ 75:4439140706d0 v2
major refactoring, added tasks support
author | cin |
---|---|
date | Wed, 10 Sep 2014 11:17:37 +0400 |
parents | c4140283575c |
children | c761fc982e1d |
line wrap: on
line diff
--- a/Implab/Promise.cs Mon Sep 08 17:40:46 2014 +0400 +++ b/Implab/Promise.cs Wed Sep 10 11:17:37 2014 +0400 @@ -225,6 +225,18 @@ Cancel(); } + + public IPromise<T> Then(ResultHandler<T> success, ErrorHandler<T> error, Action cancel) { + if (success == null && error == null && cancel == null) + return this; + + var medium = new Promise<T>(this, true); + + AddHandler(success, error, cancel, medium); + + return medium; + } + /// <summary> /// Adds new handlers to this promise. /// </summary> @@ -243,6 +255,17 @@ return medium; } + public IPromise Then(Action success, ErrorHandler error, Action cancel) { + return Then( + x => success(), + e => { + error(e); + return default(T); + }, + cancel + ); + } + public IPromise Then(Action success, ErrorHandler error) { return Then( x => success(), @@ -269,6 +292,39 @@ return medium; } + public void Last(ResultHandler<T> success, ErrorHandler error, Action cancel) { + if (success == null && error == null && cancel == null) + return; + + ErrorHandler<T> errorHandler = null; + if (error != null) + errorHandler = err => { + error(err); + return default(T); + }; + AddHandler(success, errorHandler, cancel, null); + } + + public void Last(ResultHandler<T> success, ErrorHandler error) { + Last(success, error, null); + } + + public void Last(ResultHandler<T> success) { + Last(success, null, null); + } + + public void Last(Action success,ErrorHandler error, Action cancel) { + Last(x => success(), error, cancel); + } + + public void Last(Action success,ErrorHandler error) { + Last(x => success(), error, null); + } + + public void Last(Action success) { + Last(x => success(), null, null); + } + public IPromise Error(ErrorHandler error) { if (error == null) return this; @@ -307,25 +363,6 @@ return medium; } - public IPromise<T> Anyway(Action handler) { - if (handler == null) - return this; - - var medium = new Promise<T>(this, true); - - AddHandler( - x => handler(), - e => { - handler(); - throw new TransientPromiseException(e); - }, - null, - medium - ); - - return medium; - } - /// <summary> /// Позволяет преобразовать результат выполения операции к новому типу. /// </summary> @@ -334,7 +371,7 @@ /// <param name="error">Обработчик ошибки. Данный обработчик получит /// исключение возникшее при выполнении операции.</param> /// <returns>Новое обещание, которое будет выполнено при выполнении исходного обещания.</returns> - public IPromise<TNew> Map<TNew>(ResultMapper<T, TNew> mapper, ErrorHandler<T> error) { + public IPromise<TNew> Then<TNew>(ResultMapper<T, TNew> mapper, ErrorHandler<T> error) { if (mapper == null) throw new ArgumentNullException("mapper"); @@ -370,8 +407,8 @@ return chained; } - public IPromise<TNew> Map<TNew>(ResultMapper<T, TNew> mapper) { - return Map(mapper, null); + public IPromise<TNew> Then<TNew>(ResultMapper<T, TNew> mapper) { + return Then(mapper, null); } /// <summary> @@ -384,7 +421,7 @@ /// <param name="error">Обработчик ошибки. Данный обработчик получит /// исключение возникшее при выполнении текуещй операции.</param> /// <returns>Новое обещание, которое будет выполнено по окончанию указанной аснхронной операции.</returns> - public IPromise<TNew> Chain<TNew>(ChainedOperation<T, TNew> chained, ErrorHandler<T> error) { + public IPromise<TNew> Then<TNew>(ChainedOperation<T, TNew> chained, ErrorHandler<T> error) { // проблема в том, что на момент связывания еще не начата асинхронная операция, поэтому нужно // создать посредника, к которому будут подвызяваться следующие обработчики. @@ -442,8 +479,8 @@ return medium; } - public IPromise<TNew> Chain<TNew>(ChainedOperation<T, TNew> chained) { - return Chain(chained, null); + public IPromise<TNew> Then<TNew>(ChainedOperation<T, TNew> chained) { + return Then(chained, null); } public IPromise<T> Cancelled(Action handler) { @@ -478,7 +515,7 @@ /// <typeparam name="T2"></typeparam> /// <returns></returns> public IPromise<T2> Cast<T2>() { - return Map(x => (T2)(object)x, null); + return Then(x => (T2)(object)x, null); } /// <summary> @@ -504,8 +541,7 @@ /// <returns>Результат выполнения обещания</returns> public T Join(int timeout) { var evt = new ManualResetEvent(false); - Anyway(() => evt.Set()); - Cancelled(() => evt.Set()); + Finally(() => evt.Set()); if (!evt.WaitOne(timeout, true)) throw new TimeoutException(); @@ -704,10 +740,6 @@ return Error(error); } - IPromise IPromise.Anyway(Action handler) { - return Anyway(handler); - } - IPromise IPromise.Finally(Action handler) { return Finally(handler); }