Javascript 如何在不使用延迟anit模式的情况下将jQuery$.ajax调用转换为Bluebird promises

Javascript 如何在不使用延迟anit模式的情况下将jQuery$.ajax调用转换为Bluebird promises,javascript,promise,bluebird,Javascript,Promise,Bluebird,现在我在核心文件中使用promise.deferred。这使我能够在一个中心位置解决承诺。我一直在读,我可能正在使用反模式,我想了解它为什么不好 因此,在我的core.js文件中,我有如下函数: var getMyLocation = function(location) { var promiseResolver = Promise.defer(); $.get('some/rest/api/' + location) .then(function(r

现在我在核心文件中使用promise.deferred。这使我能够在一个中心位置解决承诺。我一直在读,我可能正在使用反模式,我想了解它为什么不好

因此,在我的core.js文件中,我有如下函数:

var getMyLocation = function(location) {    
    var promiseResolver = Promise.defer();

    $.get('some/rest/api/' + location)
        .then(function(reponse) {
            promiseResolver.resolve(response);
        )}
        .catch(function(error) {
            promiseResolver.reject(error);
        });

     return promiseResolver.promise;
}
var promise = Promise.resolve($.getJSON(...));
然后在我的getLocation.js文件中,我有以下内容:

var core = require('core');
var location = core.getMyLocation('Petersburg')
    .then(function(response) {
        // do something with data
    }).catch(throw error);
在阅读了Bluebird文档和许多关于延迟反模式的博客文章后,我想知道这种模式是否实用。我可以将此更改为以下内容:

var core = require('core');
var location = core.getMyLocation('Petersburg')
    .then(function(response) {
        // do something with data
    }).catch(throw error);
core.js

var getMyLocation = function(location) {
    var jqXHR = $.get('some/rest/api/' + location);
    return Promise.resolve(jqXHR)
        .catch(TimeoutError, CancellationError, function(e) {
            jqXHR.abort();
            // Don't swallow it
            throw e;
        });
var location = core.getMyLocation('Petersburg')
    .then(function(response) {
        // do something
    })
    .catch(function(error) {
        throw new Error();
    });
getLocation.js

var getMyLocation = function(location) {
    var jqXHR = $.get('some/rest/api/' + location);
    return Promise.resolve(jqXHR)
        .catch(TimeoutError, CancellationError, function(e) {
            jqXHR.abort();
            // Don't swallow it
            throw e;
        });
var location = core.getMyLocation('Petersburg')
    .then(function(response) {
        // do something
    })
    .catch(function(error) {
        throw new Error();
    });
我想我对拥有一个使用jquery处理xhr请求的中央库的最佳方式感到困惑,而使用Bluebird处理xhr请求的最佳方式是什么

您可以调用jQuery表格并让蓝鸟同化它:

var res = Promise.resolve($.get(...)); // res is a bluebird Promise
您还可以直接在Bluebird链中返回jQuery承诺,并让它吸收它

myBluebirdApi().then(function(){
    return $.get(...);
}).then(function(result){
    // The jQuery thenable was assimilated
});

下面的代码很接近,但您不需要捕获
TimeoutError
,因为jqueryajax不会抛出这些错误。至于捕获取消错误。如果您希望取消请求,这是您所做工作的最佳实践。

要将thenable转换为Bluebird promise,您可以使用如下方式调用:

var getMyLocation = function(location) {    
    var promiseResolver = Promise.defer();

    $.get('some/rest/api/' + location)
        .then(function(reponse) {
            promiseResolver.resolve(response);
        )}
        .catch(function(error) {
            promiseResolver.reject(error);
        });

     return promiseResolver.promise;
}
var promise = Promise.resolve($.getJSON(...));
奖金部分: 大多数jqueryajax函数都是可以使用的,但请注意,如果要将需要回调的函数转换为承诺函数,可以使用。将使用参数
err,result
调用回调,这是Node.js世界中的惯例:

var promise = Promise.fromNode(function (callback) { request(url, callback); });
如果回调函数不希望其第一个参数出现潜在错误,则可以解决此问题:

var promise = Promise.fromNode(function (callback) {
  FB.api(url, function(response) { callback(response ? response.error : "no response", response); });
});

我只是有点理解你的第二种方法。你是说因为蓝鸟的承诺可以被多个thenable链接起来——每个thenable都返回一个承诺——你可以只返回JQ的延迟对象,它将被同化为一个可信的承诺吗?是的,没错,只是保留在一个BB链中我想我唯一缺少的是:拒绝承诺的用例是什么?在我的例子中,这有什么价值吗?那么BB如何处理jQuery的
.done(fn)
.fail(fn)
.always(fn)
?据我所知,BB promise处理(与大多数promise LIB一样)基于严格的单参数模型。如果我是对的,那么你不是回到了反模式的一个版本,在这个版本中,三个参数被打包成一个js普通对象吗?我仍然迷路了: