我如何知道 promise 拒绝处理程序中的错误原因?



我使用find方法编写了一些代码,如下所示。适配器是RESTAdapter。

App.SessionManager = Em.Object.extend({
  userIdChanged: function() {
    App.User.find(this.get('userid')).then(
      function(user) {
        /* process something */
      },
      function(error) {
        /* rejection handler */
        /* I want to know what error returned by the server here.*/
        /* but how? */
      }
    );
  }.observes('userid'),
});

如果我的服务器返回了一些错误(例如401),则拒绝处理程序调用。但是处理程序的参数似乎没有错误信息。我如何知道拒绝处理程序中的错误原因?

服务器返回的错误处理尚未在ember数据中完全实现。作为参考,正如在这篇关于会员数据的博客文章中所说:

我们希望让错误处理以及处理客户端和服务器冲突变得坚如磐石。Paul Chavard的pull请求目前是开放的,看起来是错误处理的一个坚实起点。在不久的将来,你应该会看到这方面的更多发展。

但同时,你可以采取一些变通措施来获取这些信息。

例如:

Ember.RSVP.configure('onerror', function(error) {
  console.log(error.message);
  console.log(error.stack);
});

或者使用肮脏的黑客获取这些信息。由于ember数据在后台使用jQuery,您可以订阅ajaxError:

$(document).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) {
  // this will trigger anytime there is an error
});

希望能有所帮助。

您也可以覆盖这个:

becameInvalid: function(record) {
  // you can get errors just by doing record.errors, error keys must match
  // the name of a field that you have defined in your model
}

和:

becameError: function(record) {
}

以防服务器中发生了导致错误的事情。我只是看到你想处理承诺中的错误,好吧,这是我没有处理过的不同之处。因为可能会触发Error。

更新:

我刚刚发现了一些有趣的东西,可能会对你有所帮助:Ember数据处理401多亏了新路由器,我还没有机会使用所有这些新功能,但它们看起来很酷。

最新更新