comparison Implab/Components/RunnableComponent.cs @ 196:40d7fed4a09e

fixed promise chaining behavior, the error handler doesn't handle result or cancellation handlers exceptions these exceptions are propagated to the next handlers.
author cin
date Mon, 29 Aug 2016 23:15:51 +0300
parents dd4a3590f9c6
children 2651cb9a4250
comparison
equal deleted inserted replaced
193:0d69c0d6de0d 196:40d7fed4a09e
118 lock (m_stateMachine) { 118 lock (m_stateMachine) {
119 Move(cmd); 119 Move(cmd);
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) {
126 if (m_pending == promise) { 140 if (m_pending == promise) {
127 Move(Commands.Ok); 141 Move(Commands.Ok);
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;
144 } 151 }
145 152