我以为我理解了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
答案 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按预期工作。