Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 带有承诺的Ember模型钩子。全部和几个findAll()_Ember.js_Promise_Ember Data_Json Api - Fatal编程技术网

Ember.js 带有承诺的Ember模型钩子。全部和几个findAll()

Ember.js 带有承诺的Ember模型钩子。全部和几个findAll(),ember.js,promise,ember-data,json-api,Ember.js,Promise,Ember Data,Json Api,我想我明白商店是如何运作的。芬德尔和承诺。一切都是有效的。但我遇到了一些奇怪的行为。 我有两个findAll(),但只有一个在承诺后被填满。所有的都进入then()-部分 请参阅此代码 export default Route.extend({ model() { var self = this; return Ember.RSVP.Promise.all([ self.store.findAll('contact'), self.store.fi

我想我明白商店是如何运作的。芬德尔和承诺。一切都是有效的。但我遇到了一些奇怪的行为。 我有两个findAll(),但只有一个在承诺后被填满。所有的都进入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处理。从网络流量中,我可以看到返回了一个消息对象,如果我调用(稍后在代码中,在模型挂钩之后):

我得到了预期的消息对象


我使用了ember 3.0.0,我找到了答案。这是由于余烬中findAll()的一个奇怪行为造成的。 FindAll()将立即返回存储中已经存在的元素。稍后,当从服务器检索到更多对象时,存储将被更新,但findAll()调用的承诺早已不复存在

为了解决这种奇怪的行为,findAll()方法有一个选项

它是这样使用的:

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

有了这个重新加载选项集,findAll()和promissions就可以像预期的那样工作。

我相信这将对将来的人有所帮助。
{reload: true}
return self.store.findAll('message', { reload: true }).then(messages => {
   var messageLength = messages.get('length');
   ...