##// END OF EJS Templates
fixed promise chaining behavior, the error handler doesn't handle result or cancellation handlers exceptions these exceptions are propagated to the next handlers.
cin -
r196:40d7fed4a09e default
parent child
Show More
@@ -132,7 +132,7 namespace Implab.Test {
132 ShouldThrow(() => p.Join(1000));
132 ShouldThrow(() => p.Join(1000));
133 Assert.AreEqual(ExecutionState.Failed, comp.State);
133 Assert.AreEqual(ExecutionState.Failed, comp.State);
134
134
135 Assert.IsInstanceOfType(comp.LastError, typeof(OperationCanceledException));
135 Assert.IsTrue(comp.LastError is OperationCanceledException);
136
136
137 comp.Dispose();
137 comp.Dispose();
138 }
138 }
@@ -185,7 +185,7 namespace Implab.Test {
185 p.Cancel();
185 p.Cancel();
186 ShouldThrow(() => p.Join(1000));
186 ShouldThrow(() => p.Join(1000));
187 Assert.AreEqual(ExecutionState.Failed, comp.State);
187 Assert.AreEqual(ExecutionState.Failed, comp.State);
188 Assert.IsInstanceOfType(comp.LastError, typeof(OperationCanceledException));
188 Assert.IsTrue(comp.LastError is OperationCanceledException);
189
189
190 comp.Dispose();
190 comp.Dispose();
191 }
191 }
@@ -23,10 +23,8 namespace Implab {
23 var p = m_task();
23 var p = m_task();
24 p.On(SetResult, HandleErrorInternal, HandleCancelInternal);
24 p.On(SetResult, HandleErrorInternal, HandleCancelInternal);
25 CancellationRequested(p.Cancel);
25 CancellationRequested(p.Cancel);
26 } catch (OperationCanceledException reason){
27 HandleCancelInternal(reason);
28 } catch(Exception err) {
26 } catch(Exception err) {
29 HandleErrorInternal(err);
27 SetErrorInternal(err);
30 }
28 }
31 }
29 }
32 }
30 }
@@ -36,10 +36,10 namespace Implab {
36 // отдавать ли результат или подтвердить отмену (или вернуть ошибку).
36 // отдавать ли результат или подтвердить отмену (или вернуть ошибку).
37 CancellationRequested(p.Cancel);
37 CancellationRequested(p.Cancel);
38 } catch (Exception err) {
38 } catch (Exception err) {
39 HandleErrorInternal(err);
39 SetErrorInternal(err);
40 }
40 }
41 } else {
41 } else {
42 HandleErrorInternal(reason ?? new OperationCanceledException());
42 SetCancelledInternal(reason);
43 }
43 }
44 }
44 }
45
45
@@ -14,10 +14,8 namespace Implab {
14 var p = m_task(value);
14 var p = m_task(value);
15 p.On(SetResult, HandleErrorInternal, HandleCancelInternal);
15 p.On(SetResult, HandleErrorInternal, HandleCancelInternal);
16 CancellationRequested(p.Cancel);
16 CancellationRequested(p.Cancel);
17 } catch (OperationCanceledException reason) {
18 HandleCancelInternal(reason);
19 } catch(Exception err) {
17 } catch(Exception err) {
20 HandleErrorInternal(err);
18 SetErrorInternal(err);
21 }
19 }
22 }
20 }
23 }
21 }
@@ -12,10 +12,8 namespace Implab {
12 try {
12 try {
13 m_task();
13 m_task();
14 SetResult();
14 SetResult();
15 } catch(OperationCanceledException reason) {
16 HandleCancelInternal(reason);
17 } catch(Exception err) {
15 } catch(Exception err) {
18 HandleErrorInternal(err);
16 SetErrorInternal(err);
19 }
17 }
20 }
18 }
21 }
19 }
@@ -42,10 +42,10 namespace Implab {
42 m_cancel(error);
42 m_cancel(error);
43 SetResult();
43 SetResult();
44 } catch(Exception err) {
44 } catch(Exception err) {
45 HandleErrorInternal(err);
45 SetErrorInternal(err);
46 }
46 }
47 } else {
47 } else {
48 HandleErrorInternal(error ?? new OperationCanceledException());
48 SetCancelledInternal(error);
49 }
49 }
50 }
50 }
51 }
51 }
@@ -12,10 +12,8 namespace Implab {
12 try {
12 try {
13 m_task(value);
13 m_task(value);
14 SetResult();
14 SetResult();
15 } catch(OperationCanceledException reason) {
16 HandleCancelInternal(reason);
17 } catch(Exception err) {
15 } catch(Exception err) {
18 HandleErrorInternal(err);
16 SetErrorInternal(err);
19 }
17 }
20 }
18 }
21 }
19 }
@@ -120,6 +120,20 namespace Implab.Components {
120
120
121 prev = m_pending;
121 prev = m_pending;
122
122
123 Action<Exception> errorOrCancel = e => {
124 if (e == null)
125 e = new OperationCanceledException();
126
127 lock (m_stateMachine) {
128 if (m_pending == promise) {
129 Move(Commands.Fail);
130 m_pending = null;
131 m_lastError = e;
132 }
133 }
134 throw new PromiseTransientException(e);
135 };
136
123 promise = task.Then(
137 promise = task.Then(
124 () => {
138 () => {
125 lock(m_stateMachine) {
139 lock(m_stateMachine) {
@@ -128,16 +142,9 namespace Implab.Components {
128 m_pending = null;
142 m_pending = null;
129 }
143 }
130 }
144 }
131 }, e => {
145 },
132 lock(m_stateMachine) {
146 errorOrCancel,
133 if (m_pending == promise) {
147 errorOrCancel
134 Move(Commands.Fail);
135 m_pending = null;
136 m_lastError = e;
137 }
138 }
139 throw new PromiseTransientException(e);
140 }
141 );
148 );
142
149
143 m_pending = promise;
150 m_pending = promise;
@@ -15,10 +15,8 namespace Implab {
15 var operation = m_task();
15 var operation = m_task();
16 operation.On(SetResult, HandleErrorInternal, HandleCancelInternal);
16 operation.On(SetResult, HandleErrorInternal, HandleCancelInternal);
17 CancellationRequested(operation.Cancel);
17 CancellationRequested(operation.Cancel);
18 } catch (OperationCanceledException reason) {
19 HandleCancelInternal(reason);
20 } catch (Exception err) {
18 } catch (Exception err) {
21 HandleErrorInternal(err);
19 SetErrorInternal(err);
22 }
20 }
23 }
21 }
24 }
22 }
@@ -43,10 +43,10 namespace Implab {
43 p.On(SetResult, HandleErrorInternal, SetCancelledInternal);
43 p.On(SetResult, HandleErrorInternal, SetCancelledInternal);
44 CancellationRequested(p.Cancel);
44 CancellationRequested(p.Cancel);
45 } catch (Exception err) {
45 } catch (Exception err) {
46 HandleErrorInternal(err);
46 SetErrorInternal(err);
47 }
47 }
48 } else {
48 } else {
49 HandleErrorInternal(reason ?? new OperationCanceledException());
49 SetCancelledInternal(reason);
50 }
50 }
51 }
51 }
52 }
52 }
@@ -14,10 +14,8 namespace Implab {
14 var operation = m_task(value);
14 var operation = m_task(value);
15 operation.On(SetResult, HandleErrorInternal, SetCancelled);
15 operation.On(SetResult, HandleErrorInternal, SetCancelled);
16 CancellationRequested(operation.Cancel);
16 CancellationRequested(operation.Cancel);
17 } catch (OperationCanceledException reason) {
18 HandleCancelInternal(reason);
19 } catch (Exception err) {
17 } catch (Exception err) {
20 HandleErrorInternal(err);
18 SetErrorInternal(err);
21 }
19 }
22 }
20 }
23 }
21 }
@@ -13,10 +13,8 namespace Implab {
13 if (m_task != null && LockCancelation()) {
13 if (m_task != null && LockCancelation()) {
14 try {
14 try {
15 SetResult(m_task());
15 SetResult(m_task());
16 } catch(OperationCanceledException reason) {
17 HandleCancelInternal(reason);
18 } catch(Exception err) {
16 } catch(Exception err) {
19 HandleErrorInternal(err);
17 SetErrorInternal(err);
20 }
18 }
21 }
19 }
22 }
20 }
@@ -40,10 +40,10 namespace Implab {
40 try {
40 try {
41 SetResult(m_cancel(reason));
41 SetResult(m_cancel(reason));
42 } catch (Exception err) {
42 } catch (Exception err) {
43 HandleErrorInternal(err);
43 SetErrorInternal(err);
44 }
44 }
45 } else {
45 } else {
46 HandleErrorInternal(reason ?? new OperationCanceledException());
46 SetCancelledInternal(reason);
47 }
47 }
48 }
48 }
49
49
@@ -12,10 +12,8 namespace Implab {
12 if (m_task != null && LockCancelation()) {
12 if (m_task != null && LockCancelation()) {
13 try {
13 try {
14 SetResult(m_task(value));
14 SetResult(m_task(value));
15 } catch(OperationCanceledException reason) {
16 HandleCancelInternal(reason);
17 } catch(Exception err) {
15 } catch(Exception err) {
18 HandleErrorInternal(err);
16 SetErrorInternal(err);
19 }
17 }
20 }
18 }
21 }
19 }
General Comments 0
You need to be logged in to leave comments. Login now