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