Mercurial > pub > ImplabNet
comparison Implab/Deferred.cs @ 248:5cb4826c2c2a v3
Added awaiters to promises
Added static methods to Promise Resolve, Reject, All.
Updated promise helpers
author | cin |
---|---|
date | Tue, 30 Jan 2018 01:37:17 +0300 |
parents | b904e0a3ba72 |
children | d82909310094 |
comparison
equal
deleted
inserted
replaced
247:fb70574741a1 | 248:5cb4826c2c2a |
---|---|
5 /// <summary> | 5 /// <summary> |
6 /// This class is responsible for the promise resolution, dispatching and chaining | 6 /// This class is responsible for the promise resolution, dispatching and chaining |
7 /// </summary> | 7 /// </summary> |
8 public class Deferred : IResolvable { | 8 public class Deferred : IResolvable { |
9 | 9 |
10 readonly AbstractPromise m_promise; | 10 readonly Promise m_promise; |
11 readonly IDispatcher m_dispatcher; | 11 readonly IDispatcher m_dispatcher; |
12 | 12 |
13 internal Deferred(AbstractPromise promise, IDispatcher dispatcher) { | 13 internal Deferred(IDispatcher dispatcher) : this(new Promise(), dispatcher) { |
14 } | |
15 | |
16 internal Deferred(Promise promise, IDispatcher dispatcher) { | |
14 Debug.Assert(promise != null); | 17 Debug.Assert(promise != null); |
15 m_promise = promise; | 18 m_promise = promise; |
16 m_dispatcher = dispatcher; | 19 m_dispatcher = dispatcher; |
17 } | 20 } |
18 | 21 |
19 public IPromise Promise { | 22 public IPromise Promise { |
20 get { return m_promise; } | 23 get { return m_promise; } |
21 } | 24 } |
22 | 25 |
23 public void Reject(Exception error) { | 26 public void Reject(Exception error) { |
24 m_promise.Reject(error); | 27 if (error is PromiseTransientException) |
28 error = ((PromiseTransientException)error).InnerException; | |
29 | |
30 m_promise.RejectPromise(error); | |
25 } | 31 } |
26 | 32 |
27 public void Resolve() { | 33 public void Resolve() { |
28 m_promise.Resolve(); | 34 m_promise.ResolvePromise(); |
29 } | 35 } |
30 | 36 |
31 public void Resolve(IPromise thenable) { | 37 public void Resolve(IPromise thenable) { |
32 if (thenable == null) | 38 if (thenable == null) |
33 Reject(new Exception("The promise or task are expected")); | 39 Reject(new Exception("The promise or task are expected")); |
34 if (thenable == m_promise) | 40 if (thenable == m_promise) |
35 Reject(new Exception("The promise cannot be resolved with oneself")); | 41 Reject(new Exception("The promise cannot be resolved with oneself")); |
36 | 42 |
37 else if (m_dispatcher != null) | 43 else if (m_dispatcher != null) |
38 // dispatch (see ecma-262/6.0: 25.4.1.3.2 Promise Resolve Functions) | 44 // dispatch (see ecma-262/6.0: 25.4.1.3.2 Promise Resolve Functions) |
39 m_dispatcher.Enqueue(() => Chain(thenable)); | 45 m_dispatcher.Enqueue(Chain, thenable); |
40 else | 46 else |
41 Chain(thenable); | 47 Chain(thenable); |
42 } | 48 } |
43 | 49 |
44 void Chain(IPromise thenable) { | 50 void Chain(IPromise thenable) { |