【问题标题】:How to bubble up a rejected promise when using Ember.PromiseProxyMixin使用 Ember.PromiseProxyMixin 时如何冒泡被拒绝的承诺
【发布时间】:2015-09-29 13:35:31
【问题描述】:

我将 Ember 的 PromiseProxyMixin 与 AJAX 数据调用和 Ember RSVP Promises 一起使用。我不想在每个路由/模板中加入错误处理,而是将被拒绝的承诺冒泡到 Application 路由中的错误处理程序,如下所示:

export default Ember.Route.extend({
    actions: {
        error: function(error, transition) {
            return this.transitionTo('error');
            return false;
        }
    }
});

目前,如果一个 Promise 被拒绝,被拒绝的 Promise 不会冒泡到 Application 路由(这是因为 PromiseProxyMixin 附加到一个 Promise 的 .fail() 函数并防止进一步冒泡吗?如果是这样,有没有继续冒泡的方式?)

是否可以使用 PromiseProxyMixin 并允许被拒绝的 Promise 冒泡到 Application 路由?

【问题讨论】:

  • 这取决于您在哪里使用 Promise 代理,如果您不将其用作路由的一部分,也不作为计算属性或其他功能的一部分,则不会在路由错误操作。这专门用于转换和路由。您可以通过位于此页面guides.emberjs.com/v1.10.0/understanding-ember/debugging 上的机制连接到其他应用程序错误/承诺错误。附带说明一下,promise 代理在遇到时仍然会抛出异常。
  • 我相信这正是原因 - 我在 Route 的模型中创建了几个 PromiseProxyMixins,但是由于有几个请求并且我想在完成后立即显示每个结果,所以我返回了一个 PromiseProxyMixins 的地图从模型函数(因此模型函数直接返回)并使用 {{#if model.somePromise.isPending}} 相应地更新模板的每个部分。我认为无论如何都应该这样做!将检查链接。谢谢!

标签: ember.js rsvp-promise


【解决方案1】:

我不确定它是否能解决您的问题,但我们确实遇到了 Es6 承诺和 jQuery 承诺的差异,因此我们默认使用以下初始化程序将所有 jQuery 承诺转换为 Es6。我们还使用下面的when 方法转换其他“thennables”:

import Ember from 'ember'; function initialize() { var $ajax = Ember.$.ajax; Ember.RSVP.when = function(promise, label) { return new Ember.RSVP.Promise(promise.then.bind(promise), label); }; return Ember.$.ajax = function() { return Ember.RSVP.when($ajax.apply(Ember.$, arguments), '$.ajax'); }; }; var PromiseAdapterInitializer = { name: 'promise-adapter', initialize: initialize }; export {initialize}; export default PromiseAdapterInitializer;

【讨论】:

  • 感谢您的帖子。我已经采取了类似的方法来转换为 RSVP 承诺,所以我认为还有其他问题导致了问题。
猜你喜欢
  • 2018-05-09
  • 2017-03-28
  • 1970-01-01
  • 2018-02-25
  • 2018-11-22
  • 2015-10-26
  • 1970-01-01
  • 2017-09-05
  • 2013-06-22
相关资源
最近更新 更多