【问题标题】:Ember model hook with a Promise.All and several findAll()带有 Promise.All 和几个 findAll() 的 Ember 模型钩子
【发布时间】:2018-08-21 15:46:32
【问题描述】:

我以为我了解 store.findAll 和 Promise.All 的工作原理。但是我遇到了一些奇怪的行为。 我有两个 findAll(),但在 Promise.All 进入 then()-part 之后,只有一个被填充。

查看此代码

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

【问题讨论】:

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


    【解决方案1】:

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

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

    {reload: true}
    

    这样使用:

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

    使用这个重新加载选项集,findAll() 和 promises 可以按预期工作。

    【讨论】:

    • 我相信这对未来的人会有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多