ember.js 并发任务

示例

另一种事实上的社区标准是称为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}}