【发布时间】:2017-12-06 17:00:30
【问题描述】:
我有一个简单的template.hbs 像这样:
// template.hbs
<p>{{model.x}}</p>
<p>{{model.y}}</p>
以下 route.js 按预期工作:
// route.js
import Route from '@ember/routing/route';
export default Route.extend({
model() {
return {
x: 'foo',
y: 'bar'
};
}
});
// output, immediately:
// foo
// bar
以下方法也可以使用,现在对整个模型使用 Promise:
// route.js
import Route from '@ember/routing/route';
import RSVP from 'rsvp';
export default Route.extend({
model() {
return new RSVP.Promise((resolve) => {
setTimeout(() => {
resolve({
x: 'foo',
y: 'bar'
});
}, 1000);
});
}
});
// output, after 1s:
// foo
// bar
以下内容,我只想对model.x 做出承诺 - 不起作用。
// route.js
import Route from '@ember/routing/route';
import RSVP from 'rsvp';
export default Route.extend({
model() {
return {
x: new RSVP.Promise((resolve) => {
setTimeout(() => {
resolve('foo');
}, 1000);
}),
y: 'bar'
};
}
});
// output, IMMEDIATELY:
// [object Object]
// bar
它立即渲染输出,但在进入setTimeout 中的回调后,它不会更改model.x 的渲染值。
我知道RSVP.hash(),但如果任何承诺被拒绝,那将被拒绝。是否可以对路由模型的不同部分有独立的 Promise 或只有全有或全无?
奇怪的是,如果有问题的承诺是由 ember-data 返回的,例如x: this.get('store').findRecord('user'),它可以正常工作(例如将template.hbs 更改为<p>{{model.x.name}}</p>)。
【问题讨论】:
标签: javascript ember.js promise