Javascript 如何在不使用延迟anit模式的情况下将jQuery$.ajax调用转换为Bluebird promises
现在我在核心文件中使用promise.deferred。这使我能够在一个中心位置解决承诺。我一直在读,我可能正在使用反模式,我想了解它为什么不好 因此,在我的core.js文件中,我有如下函数: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
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普通对象吗?我仍然迷路了: