带有Promise的Ember模型钩子。所有和几个findAll()

时间:2018-03-13 11:43:07

标签: ember.js promise ember-data json-api

我以为我理解了store.findAll和Promise.All是如何工作的。但我遇到了一些奇怪的行为。 我有两个findAll(),但只有其中一个在Promise.All进入then() - 部分之后完全填满。

请参阅此代码

export default Route.extend({
model() {
    var self = this;
    return Ember.RSVP.Promise.all([
        self.store.findAll('contact'),
        self.store.findAll('message')
    ]).then(function(values) {
        var contacts = values[0];
        var messages = values[1];
        var numberOfContacts = contacts.get('length');  // This is 39 as expected.
        var numberOfMessages = messages.get('length');  // This is 0. Expected is 1. 
        ...

消息和联系人必须有不同之处,但我无法弄清楚它是什么。它们具有非常相似的模型,并且具有非常相似的后端API处理。从网络流量我可以看到返回一个消息对象,如果我调用(稍后在代码中,在模型钩子之后):

store.peekAll('message');

我得到了我期望的消息对象。

我使用的是ember 3.0.0

1 个答案:

答案 0 :(得分:2)

我明白了。这是由于Ember中findAll()的奇怪行为。 FindAll()将立即返回商店中已存在的元素。之后,当从服务器检索到更多对象时,商店会更新,但是findAll() - 调用的承诺早已不复存在。

要解决这种奇怪的行为,可以选择findAll()方法。

{reload: true}

以这种方式使用:

return self.store.findAll('message', { reload: true }).then(messages => {
   var messageLength = messages.get('length');
   ...

使用此reload-option设置,findAll()和promises按预期工作。