ember promise - 使用模型钩子优雅地处理失败的promise

时间:2016-03-07 14:07:35

标签: ember.js promise

我正在使用路由的加载子状态向用户显示正在发生某些网络流量。如下所述: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>

1 个答案:

答案 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;
},