Mercurial > pub > ImplabNet
diff 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 |
line wrap: on
line diff
--- a/Implab/Components/RunnableComponent.cs Fri Apr 22 13:13:08 2016 +0300 +++ b/Implab/Components/RunnableComponent.cs Mon Aug 29 23:15:51 2016 +0300 @@ -120,6 +120,20 @@ prev = m_pending; + Action<Exception> errorOrCancel = e => { + if (e == null) + e = new OperationCanceledException(); + + lock (m_stateMachine) { + if (m_pending == promise) { + Move(Commands.Fail); + m_pending = null; + m_lastError = e; + } + } + throw new PromiseTransientException(e); + }; + promise = task.Then( () => { lock(m_stateMachine) { @@ -128,16 +142,9 @@ m_pending = null; } } - }, e => { - lock(m_stateMachine) { - if (m_pending == promise) { - Move(Commands.Fail); - m_pending = null; - m_lastError = e; - } - } - throw new PromiseTransientException(e); - } + }, + errorOrCancel, + errorOrCancel ); m_pending = promise;