【问题标题】:ember promise - handle a failed promise gracefully using model hookember promise - 使用模型钩子优雅地处理失败的承诺
【发布时间】:2026-01-07 17:05:01
【问题描述】:

我正在使用路由的加载子状态向用户显示一些网络流量正在发生。如此处所述:https://guides.emberjs.com/v2.4.0/routing/loading-and-error-substates/

除了在模型钩子中加载模型外,我还在路由初始化阶段保存更改。我在 aftermodel 钩子中这样做。 像这样的:

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

这在大多数情况下都很有效。当我的部分或全部承诺失败时,问题就出现了,可能是由于离线。所以我想在我的 Promise 中添加一个“then”-handler,以便在 Promise 完成后执行一些代码。如何在添加 then-handler 的同时保持加载子状态?

换句话说,我怎样才能在 ajax 调用开始后立即向模型钩子或后模型钩子返回一个承诺,同时拥有处理承诺结果的代码?

【问题讨论】:

    标签: ember.js promise


    【解决方案1】:

    如何在 ajax 调用开始后立即向模型挂钩或后模型挂钩返回一个承诺,同时拥有处理承诺结果的代码?

    只需使用一个承诺。这就是他们的工作方式。它们总是同步返回(同时,有处理结果的代码)。

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

    这将立即返回承诺。当 promise 解决时,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;
    },
    

    【讨论】:

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