2016-03-07 42 views
0

我正在使用路由的加载子状态向用户显示某些网络流量正在发生。如下所述:https://guides.emberjs.com/v2.4.0/routing/loading-and-error-substates/ember promise - 使用模型钩优雅地处理失败的承诺

除了在模型钩子中加载模型外,我还会在路由初始化阶段保存更改。我在后模式中这样做。 事情是这样的:

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); 
    }  
} 

这种运作良好,在大多数情况下。当我的一些或全部承诺失败时,可能由于脱机而出现问题。所以我想为我的承诺添加一个“then”处理程序,因此可以在承诺完成时执行一些代码。我怎样才能添加一个后处理程序,并同时保持加载子状态?

换句话说,我怎么可以返回一个承诺模式钩或aftermodel钩只要Ajax调用开始,并在同一时间有一个处理的承诺的结果代码?

回答

1

一旦ajax调用启动并且同时有处理promise的结果的代码,我该如何返回对模型钩子或aftermodel钩子的承诺?

只是使用承诺。这是他们的工作方式。它们总是同步返回(并且同时具有处理结果的代码)。

return promise.then(() => doSomething()); 

这将立即返回承诺。当承诺解决时,将执行then函数。

SaveAnyUnsavedObjects应在所有情况下返回承诺(例如else { return new Ember.RSVP.Promise(resolve => resolve());)。这将让你在afterModel致电then

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; 
}, 
+0

真的吗?这比我想象的要容易。谢谢! –