Previous: Cancellation
Next: Child Tasks
When you
await
a promise or async function call, your task function will pause execution
until one of three things happens:
The
Task Function Syntax docs
demonstrates how you can use standard JavaScript
try/catch
blocks to catch exceptions thrown when you await a rejecting promise, but
what about cancelation? Are cancelations considered exceptions/errors, or
something else?
In ember-concurrency, cancelation is considered a third kind of
"completion" (the other two being a successful return from a function, and
throwing an exception from a function). Specifically, this means that if a
task is canceled while it is paused on a yield, the task will essentially
return from that point, it will skip any
catch(e) {}
blocks it is in, but it
will
execute any
finally {}
blocks. The benefit of this behavior is that:
finally
blocks will always run and can be used for cleanup logic *catch
blocks (which you'd annoyingly have to do if cancelation were considered
just another type of error).
* While
finally
blocks are nice for cleanup logic, make sure you're leveraging the power
of
Task Modifiers
and
.isRunning / .isIdle
task properties as much as possible so that you're not manually
re-implementing a lot of the implicit state that ember-concurrency
provides you for free, e.g. you should avoid manually toggling the
visibility of a loading spinner within a task if you could accomplish
the same thing using the
.isRunning
property on a task.
Both of the buttons below will (re)start
myTask
when clicked. If you click the buttons quickly, it will cause the
currently running task to cancel from the
await
where it is paused. Notice how cancelations don't increment the
numErrors
property because cancelations skip the
catch
block.
Previous: Cancellation
Next: Child Tasks