ember-concurrency 任务
另一个社区事实上的标准是一个名为 ember-concurrency 的插件,它会使许多承诺混乱消失。
它可以使用命令 ember install ember-concurrency
安装。
优点
- 复杂异步代码的直观推理。
- 提供用于管理任务的完整 API。
- 可以取消。
- 可以直接在组件中使用,而无需代理对象。
- 结构承诺在任务函数内部。
- 可以使用 JavaScript
try
/catch
/finally
块来管理异步分配,异常和清理。 - 在
willDestroy
事件中自动取消任务,避免在被破坏的对象上设置值的错误(例如,在计时器之后)
缺点
- 不是内置的 - 需要
ember install ember-concurrency
- 使用生成器函数可能会混淆开发人员用于承诺链。
JavaScript
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}}