##// END OF EJS Templates
Added the chaining method to the non-generic IPromise
cin -
r96:daffa72a1cec v2
parent child
Show More
@@ -31,6 +31,10 namespace Implab {
31 IPromise Then(Action success, ErrorHandler error);
31 IPromise Then(Action success, ErrorHandler error);
32 IPromise Then(Action success);
32 IPromise Then(Action success);
33
33
34 IPromise Chain(Func<IPromise> chained, ErrorHandler<IPromise> error, Action cancel);
35 IPromise Chain(Func<IPromise> chained, ErrorHandler<IPromise> error);
36 IPromise Chain(Func<IPromise> chained);
37
34 /// <summary>
38 /// <summary>
35 /// Добавляет последнй обработчик в цепочку обещаний, не создает промежуточных обещаний.
39 /// Добавляет последнй обработчик в цепочку обещаний, не создает промежуточных обещаний.
36 /// </summary>
40 /// </summary>
@@ -351,6 +351,7 namespace Implab {
351 /// <param name="error">Обработчик ошибки. Данный обработчик получит
351 /// <param name="error">Обработчик ошибки. Данный обработчик получит
352 /// исключение возникшее при выполнении операции.</param>
352 /// исключение возникшее при выполнении операции.</param>
353 /// <returns>Новое обещание, которое будет выполнено при выполнении исходного обещания.</returns>
353 /// <returns>Новое обещание, которое будет выполнено при выполнении исходного обещания.</returns>
354 /// <param name = "cancel"></param>
354 public IPromise<TNew> Then<TNew>(ResultMapper<T, TNew> mapper, ErrorHandler<TNew> error, Action cancel) {
355 public IPromise<TNew> Then<TNew>(ResultMapper<T, TNew> mapper, ErrorHandler<TNew> error, Action cancel) {
355 Safe.ArgumentNotNull(mapper, "mapper");
356 Safe.ArgumentNotNull(mapper, "mapper");
356
357
@@ -413,6 +414,7 namespace Implab {
413 /// <param name="error">Обработчик ошибки. Данный обработчик получит
414 /// <param name="error">Обработчик ошибки. Данный обработчик получит
414 /// исключение возникшее при выполнении текуещй операции.</param>
415 /// исключение возникшее при выполнении текуещй операции.</param>
415 /// <returns>Новое обещание, которое будет выполнено по окончанию указанной аснхронной операции.</returns>
416 /// <returns>Новое обещание, которое будет выполнено по окончанию указанной аснхронной операции.</returns>
417 /// <param name = "cancel"></param>
416 public IPromise<TNew> Chain<TNew>(ResultMapper<T, IPromise<TNew>> chained, ErrorHandler<IPromise<TNew>> error, Action cancel) {
418 public IPromise<TNew> Chain<TNew>(ResultMapper<T, IPromise<TNew>> chained, ErrorHandler<IPromise<TNew>> error, Action cancel) {
417
419
418 Safe.ArgumentNotNull(chained, "chained");
420 Safe.ArgumentNotNull(chained, "chained");
@@ -759,29 +761,119 namespace Implab {
759
761
760 IPromise IPromise.Then(Action success, ErrorHandler error, Action cancel) {
762 IPromise IPromise.Then(Action success, ErrorHandler error, Action cancel) {
761 return Then(
763 return Then(
762 x => success(),
764 success != null ? new ResultHandler<T>(x => success()) : null,
763 e => {
765 error != null ? new ErrorHandler<T>(e => {
764 error(e);
766 error(e);
765 return default(T);
767 return default(T);
766 },
768 }) : null,
767 cancel
769 cancel
768 );
770 );
769 }
771 }
770
772
771 IPromise IPromise.Then(Action success, ErrorHandler error) {
773 IPromise IPromise.Then(Action success, ErrorHandler error) {
772 return Then(
774 return Then(
773 x => success(),
775 success != null ? new ResultHandler<T>(x => success()) : null,
774 e => {
776 error != null ? new ErrorHandler<T>(e => {
775 error(e);
777 error(e);
776 return default(T);
778 return default(T);
777 }
779 }) : null
778 );
780 );
779 }
781 }
780
782
781 IPromise IPromise.Then(Action success) {
783 IPromise IPromise.Then(Action success) {
784 Safe.ArgumentNotNull(success, "success");
782 return Then(x => success());
785 return Then(x => success());
783 }
786 }
784
787
788 IPromise IPromise.Chain(Func<IPromise> chained, ErrorHandler<IPromise> error, Action cancel) {
789 return ChainNoResult(chained, error, cancel);
790 }
791
792 IPromise ChainNoResult(Func<IPromise> chained, ErrorHandler<IPromise> error, Action cancel) {
793 Safe.ArgumentNotNull(chained, "chained");
794
795 var medium = new Promise<object>(this, true);
796
797 ResultHandler<T> resultHandler = delegate(T result) {
798 if (medium.IsCancelled)
799 return;
800
801 var promise = chained();
802
803 promise.Last(
804 medium.Resolve,
805 medium.Reject,
806 () => medium.Reject(new OperationCanceledException()) // внешняя отмена связанной операции рассматривается как ошибка
807 );
808
809 // notify chained operation that it's not needed anymore
810 // порядок вызова Then, Cancelled важен, поскольку от этого
811 // зависит IsExclusive
812 medium.Cancelled(() => {
813 if (promise.IsExclusive)
814 promise.Cancel();
815 });
816 };
817
818 ErrorHandler<T> errorHandler;
819
820 if (error != null)
821 errorHandler = delegate(Exception e) {
822 try {
823 var promise = error(e);
824
825 promise.Last(
826 medium.Resolve,
827 medium.Reject,
828 () => medium.Reject(new OperationCanceledException()) // внешняя отмена связанной операции рассматривается как ошибка
829 );
830
831 // notify chained operation that it's not needed anymore
832 // порядок вызова Then, Cancelled важен, поскольку от этого
833 // зависит IsExclusive
834 medium.Cancelled(() => {
835 if (promise.IsExclusive)
836 promise.Cancel();
837 });
838 } catch (Exception e2) {
839 medium.Reject(e2);
840 }
841 return default(T);
842 };
843 else
844 errorHandler = err => {
845 medium.Reject(err);
846 return default(T);
847 };
848
849
850 Action cancelHandler;
851 if (cancel != null)
852 cancelHandler = () => {
853 if (cancel != null)
854 cancel();
855 medium.Cancel();
856 };
857 else
858 cancelHandler = medium.Cancel;
859
860 AddHandler(
861 resultHandler,
862 errorHandler,
863 cancelHandler,
864 null
865 );
866
867 return medium;
868 }
869 IPromise IPromise.Chain(Func<IPromise> chained, ErrorHandler<IPromise> error) {
870 return ChainNoResult(chained, error, null);
871 }
872 IPromise IPromise.Chain(Func<IPromise> chained) {
873 return ChainNoResult(chained, null, null);
874 }
875
876
785 void IPromise.Last(Action success, ErrorHandler error, Action cancel) {
877 void IPromise.Last(Action success, ErrorHandler error, Action cancel) {
786 Last(x => success(), error, cancel);
878 Last(x => success(), error, cancel);
787 }
879 }
@@ -58,7 +58,7 namespace Implab
58 }
58 }
59
59
60 [DebuggerStepThrough]
60 [DebuggerStepThrough]
61 public static IPromise<T> InvokePromise<T>(Action action) {
61 public static IPromise InvokePromise(Action action) {
62 ArgumentNotNull(action, "action");
62 ArgumentNotNull(action, "action");
63
63
64 var p = new Promise<object>();
64 var p = new Promise<object>();
General Comments 0
You need to be logged in to leave comments. Login now