An alternative community de facto standard is an addon called ember-concurrency that makes a lot of the promise confusion go away.
It can be installed with the command ember install ember-concurrency
.
try
/ catch
/ finally
blocks to manage asynchronous assignment, exceptions, and cleanup.willDestroy
event, avoiding errors setting values on destroyed objects (e.g. after a timer)ember install ember-concurrency
import Ember from 'ember';
import { task, timeout } from 'ember-concurrency';
const { Component, set } = Ember;
export default Component.extend({
myTask: task(function * () {
set(this, 'error', null);
try {
yield timeout(2000);
return 'Foobar';
} catch (err) {
set(this, 'error', error);
}
}).keepLatest()
});
{{#if myTask.isIdle}}
<button onclick={{perform myTask}}>
Start Task
</button>
{{else}}
Loading…
{{/if}}
{{#if myTask.last.value}}
Done. {{myTask.last.value}}
{{/if}}
{{#if error}}
Something went wrong. {{error}}
{{/if}}