Mercurial > pub > ImplabNet
comparison Implab/Deferred`1.cs @ 246:5aa9cfbe56c3 v3
missing files
author | cin |
---|---|
date | Fri, 26 Jan 2018 11:19:38 +0300 |
parents | |
children | 5cb4826c2c2a |
comparison
equal
deleted
inserted
replaced
245:b904e0a3ba72 | 246:5aa9cfbe56c3 |
---|---|
1 using System; | |
2 using System.Diagnostics; | |
3 | |
4 namespace Implab { | |
5 public class Deferred<T> : IResolvable<T> { | |
6 readonly AbstractPromise<T> m_promise; | |
7 readonly IDispatcher m_dispatcher; | |
8 | |
9 internal Deferred(AbstractPromise<T> promise, IDispatcher dispatcher) { | |
10 Debug.Assert(promise != null); | |
11 m_promise = promise; | |
12 m_dispatcher = dispatcher; | |
13 } | |
14 | |
15 public IPromise<T> Promise { | |
16 get { return m_promise; } | |
17 } | |
18 | |
19 public void Reject(Exception error) { | |
20 m_promise.Reject(error); | |
21 } | |
22 | |
23 public void Resolve(T value) { | |
24 m_promise.Resolve(value); | |
25 } | |
26 | |
27 public void Resolve(IPromise<T> thenable) { | |
28 if (thenable == null) | |
29 Reject(new Exception("The promise or task are expected")); | |
30 if (thenable == m_promise) | |
31 Reject(new Exception("The promise cannot be resolved with oneself")); | |
32 | |
33 else if (m_dispatcher != null) | |
34 // dispatch (see ecma-262/6.0: 25.4.1.3.2 Promise Resolve Functions) | |
35 m_dispatcher.Enqueue(() => Chain(thenable)); | |
36 else | |
37 Chain(thenable); | |
38 } | |
39 | |
40 void Chain(IPromise<T> thenable) { | |
41 try { | |
42 thenable.Then(this); | |
43 } catch (Exception err) { | |
44 Reject(err); | |
45 } | |
46 } | |
47 } | |
48 } |