处理计算属性中的链式Promise

时间:2015-09-28 01:46:29

标签: ember.js ember-data

如果我在promise上有then()函数,它永远不会通过计算属性

正确解析

所以这没关系,

  taxRate: computed(function() {
    return this.get('store').findRecord('tax-rate', { current: true });
  })

但这不是,(输出[object Object] - 承诺 - 在htmlbars模板中)

  taxRateValue: computed(function() {
    return this.get('store').findRecord('tax-rate', { current: true }).then((taxRate) => {
      return taxRate.get('taxRateValue');
    })
  })

那么在不使用观察者的情况下处理此问题的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

第一个有效,因为Ember Data在内部使用capabilities。内部工作有点棘手,但它的要点是当它的承诺结算时,对象会激活观察者。第二个不起作用,因为你不再返回一个实现Ember对象系统的对象,你只是返回一个promise。模板不知道如何处理promise,这就是对象逻辑中的所有内容。至于你的问题:

  

那么在不使用观察者的情况下处理此的正确方法是什么?

我担心这是不可能的。您将需要直接或间接使用某种观察者某处。我建议直接使用一个来明确发生了什么:

taxRateValue: null,

taxRateValuePromise: observes('someProperty?', function() {
    this.get('store').findRecord('tax-rate', { current: true }).then((taxRate) => {
        this.set('taxRateValue', taxRate.get('taxRateValue'));
    })
}),

您也可以重用PromiseObject,但这需要您使用对象而不是值:

taxRateValue: computed(function() {
    return DS.PromiseObject.create({
        promise: this.get('store').findRecord('tax-rate', { current: true }).then((taxRate) => {
            return taxRate.get('taxRateValue');
        })
    });
})

然后在你的模板中:

{{taxRateValue.content}}

答案 1 :(得分:0)

与商店的通信应该在可以做的路线内进行

  setupController(controller, model) {
    var promise = this.get('store').findRecord('tax-rate', { current: true })
      .then(taxRate => taxRate.get('taxRateValue'))
      .then(taxRateValue => controller.set('taxRateValue', taxRateValue)); //pass actual value

    controller.set('taxRateValue', promise); //pass promise to template to display loader
  }