PromiseProxyMixin

Ember 附带了一个内置的帮助程序,它将为异步任务的状态提供计算属性。

优点

  • 内置 - 无需插件。
  • 可以在组件的生命周期中进行管理。
  • 提供可以驱动模板逻辑的方便的状态属性。

缺点

  • 必须用 Ember.Object 包裹,不能直接应用于 Ember.Component
  • 在原始承诺链和 content 值的破坏之间创建断开连接。
  • 不是非常直观,可能很难推理。
  • 无法取消。

JavaScript

import Ember from 'ember';

const {
  Component, PromiseProxyMixin, get, set, computed,
  isPresent, run, RSVP: { Promise }
} = Ember;

const MyPromiseProxy = Ember.Object.extend(PromiseProxyMixin);

export default Component({
  myProxy: computed('promise', {
    get() {
      const promise = get(this, 'promise');
      return isPresent(promise) ? MyPromiseProxy.create({promise}) : null;
    }
  }),

  actions: {
    performTask() {
      const fakeTask = new Promise((resolve) => {
        run.later(resolve, 'Foobar', 2000);
      });
      set(this, 'promise', fakeTask);
    }
  }
});

模板

{{#if myProxy.isPending}}
  Loading…
{{else}}
  <button onclick={{action "performTask"}}>
    Start Task
  </button>
{{/if}}

{{#if myProxy.isFulfilled}}
  Done. {{myProxy.content}}
{{/if}}

{{#if myProxy.isRejected}}
  Something went wrong. {{myProxy.reason}}
{{/if}}