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&hellip;
{{/if}} 

{{#if myTask.last.value}}
  Done. {{myTask.last.value}}
{{/if}}

{{#if error}}
  Something went wrong. {{error}}
{{/if}}