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