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}}