8th January 2018 at 1:59pm
In Ember the PromiseProxyMixin is a pattern for wrapping a Promise in an object that reacts and provides some derived state about the promise.
It works very well with ObjectProxy or ArrayProxy.
Basic usage
const {
  Object: EmObject,
  PromiseProxyMixin
} = Ember;
const MyObject = EmObject.extend(PromiseProxyMixin);
let myObjectInstance = MyObject.create({
  promise: RSVP.resolve()
});This will provide you with an object with the following properties:
isPending- Is the promise pending?isSettled- Is the promise resolved or rejected?isFulfilled- Is the promise resolved (fulfilled)?isRejected- Is the promise rejected (error)?content- The value if the promise has been fulfilled.reason- The error if the promise has been rejected.
Example Use
// app/components/my-component.js
import Ember from 'ember';
const {
  Component,
  Logger,
  ObjectProxy,
  PromiseProxyMixin,
  computed
} = Ember;
const Wrapper = ObjectProxy.extend(PromiseProxyMixin);
export default Component.extend({
  wrapper: computed('delayedValue', {
    get() {
      let promise = this.get('delayedValue');
      let wrapper = Wrapper.create({promise});
      // Stop an unhandled promise error because we handle the error in the
      // template.
      wrapper.catch(() => {});
      return wrapper;
    }
  })
});{{! app/templates/components/my-component.hbs }}
{{#if wrapper.isPending}}
  Loading…
{{else if wrapper.isRejected}}
  Error: {{wrapper.reason}}
{{else}}
  {{! The actual object is in content but the properties are proxied and
  accessible directly without diving into content. }}
  Value: {{wrapper.content}}
{{/if}}