【问题标题】:BluebirdJS promise with jQuery not working properly [duplicate]BluebirdJS 承诺与 jQuery 无法正常工作 [重复]
【发布时间】:2016-02-15 09:18:05
【问题描述】:

使用此处提到的Promise.resolve($.ajax(options)) http://bluebirdjs.com/docs/api/promise.resolve.html 不起作用。

var $ = require('jquery');
var Promise = require('bluebird');

function makeRequest(options) {

      return Promise.resolve($.ajax(options))
        .then(function(data) { return data; },
              function (error) { return error; });

}

当我调用返回错误(在这种情况下为 403)的 url 时,我再添加一个“.then”,它总是调用已完成的处理程序。

makeRequest(options).then(iAmBeingCalledWhenTheRequestFails, iAmNotBeingCalled);

【问题讨论】:

    标签: javascript jquery promise bluebird


    【解决方案1】:

    当你这样做时:

      return Promise.resolve($.ajax(options))
        .then(function(data) { return data; },
              function (error) { return error; });
    

    这是有效的:

    try {
      return $.ajax(options);
    } catch (e){
      return e;
    }
    

    Promises 像常规同步代码一样具有异常处理,当您 return 形成异常处理程序时,您可以从错误中恢复(例如 try catch)。如果你想添加一个错误处理程序保持链处于拒绝状态 - 你需要 throw 错误。

    更好的是,在这种情况下不要附加错误处理程序。

     return Promise.resolve($.ajax(options)); // that's all folks!
    

    【讨论】:

    • “当您从异常处理程序中返回时,您会从错误中恢复(如 try catch)”。非常感谢,我想我错过了承诺(你认为你知道但实际上不知道的事情之一)。
    • @WalterMacambira 没关系 - 非常有名的 jQuery missed the point of promises themselves.
    • @WalterMacambira 异常应该是非常罕见的,并且无论如何对于边缘情况(例如服务器返回错误) - 所以无论如何它都不应该成为问题。你也可以return Promise.reject(err); 做同样的事情(因为如果你从then 处理程序返回一个承诺,链条将假定它的状态)但老实说——这没什么大不了的,因为异常应该非常罕见。
    • @WalterMacambira 如果您实际上并不打算对错误做任何事情,那么首先没有理由抓住它。这就是本杰明帖子的结尾所说的。
    • @WalterMacambira 在客户端,除非您正在执行数以万计的throws,否则性能应该不是问题。即便如此 - 测量它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 2018-12-11
    • 2018-02-09
    相关资源
    最近更新 更多