Mercurial > pub > ImplabNet
comparison Implab/PromiseExtensions.cs @ 209:a867536c68fc v2
Bound promise to CancellationToken
Added new states to ExecutionSate enum.
Added Safe.Guard() method to handle cleanup of the result of the promise
| author | cin | 
|---|---|
| date | Wed, 16 Nov 2016 03:06:08 +0300 | 
| parents | 7d07503621fe | 
| children | 5cb4826c2c2a | 
   comparison
  equal
  deleted
  inserted
  replaced
| 208:7d07503621fe | 209:a867536c68fc | 
|---|---|
| 179 /// <param name="that"></param> | 179 /// <param name="that"></param> | 
| 180 /// <param name="cleanup">A callback used to cleanup already resolved promises in case of an error</param> | 180 /// <param name="cleanup">A callback used to cleanup already resolved promises in case of an error</param> | 
| 181 /// <returns></returns> | 181 /// <returns></returns> | 
| 182 public static IPromise<T[]> PromiseAll<T>(this ICollection<IPromise<T>> that, Action<T> cleanup) { | 182 public static IPromise<T[]> PromiseAll<T>(this ICollection<IPromise<T>> that, Action<T> cleanup) { | 
| 183 Safe.ArgumentNotNull(that, "that"); | 183 Safe.ArgumentNotNull(that, "that"); | 
| 184 | 184 | 
| 185 int count = that.Count; | 185 int count = that.Count; | 
| 186 | 186 | 
| 187 if (count == 0) | 187 if (count == 0) | 
| 188 return Promise<T[]>.FromResult(new T[0]); | 188 return Promise<T[]>.FromResult(new T[0]); | 
| 189 | 189 | 
| 261 return Then(that, success, null, null); | 261 return Then(that, success, null, null); | 
| 262 } | 262 } | 
| 263 | 263 | 
| 264 public static IPromise<T2> Then<T, T2>(this IPromise<T> that, Func<T, T2> success, Func<Exception, T2> error, Func<Exception, T2> cancel) { | 264 public static IPromise<T2> Then<T, T2>(this IPromise<T> that, Func<T, T2> success, Func<Exception, T2> error, Func<Exception, T2> cancel) { | 
| 265 Safe.ArgumentNotNull(that, "that"); | 265 Safe.ArgumentNotNull(that, "that"); | 
| 266 Safe.ArgumentNotNull(success, "success"); | |
| 267 | |
| 266 var d = new FuncTask<T, T2>(success, error, cancel, false); | 268 var d = new FuncTask<T, T2>(success, error, cancel, false); | 
| 267 that.On(d.Resolve, d.Reject, d.CancelOperation); | 269 that.On(d.Resolve, d.Reject, d.CancelOperation); | 
| 268 d.CancellationRequested(that.Cancel); | 270 d.CancellationRequested(that.Cancel); | 
| 269 return d; | 271 return d; | 
| 270 } | 272 } | 
| 274 var d = new FuncTask<T, T>( | 276 var d = new FuncTask<T, T>( | 
| 275 x => { | 277 x => { | 
| 276 success(x); | 278 success(x); | 
| 277 return x; | 279 return x; | 
| 278 }, | 280 }, | 
| 279 error, | 281 error, | 
| 280 cancel, | 282 cancel, | 
| 281 false | 283 false | 
| 282 ); | 284 ); | 
| 283 that.On(d.Resolve, d.Reject, d.CancelOperation); | 285 that.On(d.Resolve, d.Reject, d.CancelOperation); | 
| 284 d.CancellationRequested(that.Cancel); | 286 d.CancellationRequested(that.Cancel); | 
| 285 return d; | 287 return d; | 
| 425 return Chain(that, success, null, null); | 427 return Chain(that, success, null, null); | 
| 426 } | 428 } | 
| 427 | 429 | 
| 428 #endregion | 430 #endregion | 
| 429 | 431 | 
| 432 public static IPromise<T2> Guard<T, T2>(this IPromise<T> that, Func<IPromise<T>, IPromise<T2>> continuation, Action<T> cleanup) { | |
| 433 Safe.ArgumentNotNull(that, "that"); | |
| 434 Safe.ArgumentNotNull(continuation, "continuation"); | |
| 435 return continuation(that).Error((err) => { | |
| 436 that.On(cleanup); | |
| 437 }, true); | |
| 438 } | |
| 430 | 439 | 
| 431 #if NET_4_5 | 440 #if NET_4_5 | 
| 432 | 441 | 
| 433 public static PromiseAwaiter<T> GetAwaiter<T>(this IPromise<T> that) { | 442 public static PromiseAwaiter<T> GetAwaiter<T>(this IPromise<T> that) { | 
| 434 Safe.ArgumentNotNull(that, "that"); | 443 Safe.ArgumentNotNull(that, "that"); | 
| 438 | 447 | 
| 439 public static PromiseAwaiter GetAwaiter(this IPromise that) { | 448 public static PromiseAwaiter GetAwaiter(this IPromise that) { | 
| 440 Safe.ArgumentNotNull(that, "that"); | 449 Safe.ArgumentNotNull(that, "that"); | 
| 441 | 450 | 
| 442 return new PromiseAwaiter(that); | 451 return new PromiseAwaiter(that); | 
| 452 } | |
| 453 | |
| 454 public static IPromise BoundCancellationToken(this IPromise that, CancellationToken ct) { | |
| 455 Safe.ArgumentNotNull(that, "that"); | |
| 456 ct.Register(that.Cancel); | |
| 457 return that.Then(null, null, (err) => { | |
| 458 ct.ThrowIfCancellationRequested(); | |
| 459 throw new PromiseTransientException(err); | |
| 460 }); | |
| 461 } | |
| 462 | |
| 463 public static IPromise<T> BoundCancellationToken<T>(this IPromise<T> that, CancellationToken ct) { | |
| 464 Safe.ArgumentNotNull(that, "that"); | |
| 465 ct.Register(that.Cancel); | |
| 466 return that.Then(null, null, (err) => { | |
| 467 ct.ThrowIfCancellationRequested(); | |
| 468 throw new PromiseTransientException(err); | |
| 469 }); | |
| 443 } | 470 } | 
| 444 | 471 | 
| 445 #endif | 472 #endif | 
| 446 } | 473 } | 
| 447 } | 474 } | 
