then()在应该挂起时返回null值

时间:2018-11-28 18:46:53

标签: javascript ember.js promise ember-data

Ember 2.17

我正在从模板中调用帮助程序:

{{#each invoice.invoiceLines as |line| }}
  {{pricings/full-pricing line.pricing}}
{{/each}}

invoiceinvoiceLinepricing都是余烬模型。

以下是在模型()中创建发票的方式:

model(params) {
    let invoice= this.store.findRecord('invoice',params.invoice_id)
    return Ember.RSVP.hash({
      invoice: invoice,
      allShares: invoice.then((i)=>{return i.allShares()}),
      detailShares: invoice.then((i)=>{return i.detailShares()})
    });
  }

帮助者的目标是获取价格,提取数字(模型中的所有内容,不再有任何关系)并返回一个格式化初始价格和订阅价格的字符串。 助手如下:

import { helper } from '@ember/component/helper';

export function pricingsFullPricing([pricing]) {
  return pricing.then(
    p=>{
      debugger
    },p=>{

    }
  )
}
export default helper(pricingsFullPricing);

运行页面时,调试器被调用两次(模板循环运行一次)。

第一次p为空,第二次为定价。

then是否应该防止这种情况发生?为什么会这样呢?

2 个答案:

答案 0 :(得分:2)

您的路线是错误的,路线具有诺言意识(这就是hash的意思),应该是:

model(params) {
    return Ember.RSVP.hash({
      invoice: this.store.findRecord('invoice',params.invoice_id)
      //allShares: invoice.then((i)=>{return i.allShares()}),
      //detailShares: invoice.then((i)=>{return i.detailShares()})
    });
  }

那么您的把手就是:

{{#each model.invoice.invoiceLines as |line| }}
  {{line}}
{{/each}}

您也不应该像在模型上那样调用方法。目前尚不清楚allShares()等的作用,但是在 controller 中应该(可能)是computed。类似于:

import { computed } from '@ember/object';

export default Controller.extend({
   allShares:computed('model.invoice', function(){
       return this.get('model.invoice').allShares();
   });
});

尽管这似乎并不理想。就像我说的那样,很难弄清楚,因为不清楚您要在这里做什么。如果您将这些方法提取到service 中,可能会更有意义。

然后您根本不需要帮助程序。这似乎只是在兑现承诺。

如果您尝试在加载前将所有服务器端数据加载到route中,则会使工作变得更加轻松

答案 1 :(得分:2)

帮手的首要规则

  

每当更改辅助输入时,都会再次调用计算功能。

第二,关于帮助程序的任何事情都不会阻止此后续调用,因为您正在返回承诺。

export function pricingsFullPricing([pricing]) {
  return pricing.then(
    p=>{
      debugger
    },p=>{

    }
  )
}

您在此处创建了一个简单的帮助程序,它将使用promise本身作为值。查看ember-promise-helpers/await,了解如何使用class based helper手动设置模板中显示的值。

现在,如果您想知道为什么要进行重新计算,我将不得不基于自己对Ember数据的了解而推测出自己是否只是Ember社区的一员(我从未真正使用过Ember Data )。您知道line.pricing是一个承诺吗?然后,我可以假设您使用的是某种关系,很可能必须通过ajax调用来加载(因此,promise)。但是Ember数据iirc中的这些关系使用此PromiseProxyMixin,使它们能够像承诺或对象一样同时运行(取决于数据是否已存储)。这样一来,您无需then

就可以在模板中引用Promise

请参阅此article,以更好地理解我的意思