另一种事实上的社区标准是称为ember-concurrency的附加组件,它使很多承诺混乱都消除了。
可以使用命令安装ember install ember-concurrency。
复杂异步代码的直观推理。
提供用于管理任务的完整API。
可以取消。
可以直接在组件中使用,而无需代理对象。
在任务功能内部分解承诺。
可以使用JavaScript try/ catch/finally块管理异步分配,异常和清理。
任务在willDestroy发生事件时会自动取消,从而避免错误设置销毁对象的值(例如在计时器之后)
不内置-要求 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}}