我正在使用路由的加载子状态向用户显示正在发生某些网络流量。如下所述:https://guides.emberjs.com/v2.4.0/routing/loading-and-error-substates/
除了在模型钩子中加载模型外,我还在路径初始化阶段保存更改。我在后模型钩子中这样做。 像这样:
afterModel () {
var session = this.get('session');
return session.SaveAnyUnsavedObjects();
},
//session.js
SaveAnyUnsavedObjects: function() {
var promises = [];
...
activities.forEach(function(activity) {
if(activity.get('hasDirtyAttributes')) {
promises.pushObject(activity.save());
}
}
if(promises.get('length') > 0)
{
// Use RSVP.Promise.allSettled() to resolve an array of promises.
return Ember.RSVP.allSettled(promises);
}
}
这在大多数情况下效果很好。当我的一些或所有承诺失败时,可能由于离线而出现问题。所以我想在我的承诺中添加"然后" -handler,因此可以在承诺完成时执行一些代码。如何添加then-handler并同时保留加载子状态?
换句话说,一旦ajax调用开始,我怎么能向模型钩子或者模型后钩子返回一个promise,同时又有处理promise的结果的代码? < / p>
答案 0 :(得分:1)
如果ajax调用一开始,我怎么能在模型钩子或aftermodel钩子上返回一个promise,同时又有处理promise的结果的代码?
只需使用承诺。这就是他们的工作方式。它们总是同步返回(同时具有处理结果的代码)。
return promise.then(() => doSomething());
这将立即返回承诺。当promise结算时,then
函数将被执行。
SaveAnyUnsavedObjects
应该在所有情况下都返回一个承诺(例如else { return new Ember.RSVP.Promise(resolve => resolve());
)。这样您就可以在then
中致电afterModel
:
afterModel () {
return this.get('session').SaveAnyUnsavedObjects().then((result) => {
// do something with the result
});
},
更详细,但等效,
afterModel () {
var session = this.get('session');
var savePromise = session.SaveAnyUnsavedObjects();
savePromise.then((result) => {
// do something with the result
});
return savePromise;
},