gpt4 book ai didi

javascript - 如何在没有延迟反模式的情况下将 jQuery $.ajax 调用转换为 Bluebird promise

转载 作者:行者123 更新时间:2023-12-03 12:14:03 25 4
gpt4 key购买 nike

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

所以在我的核心.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;
}

然后在我的 获取位置.js 文件我有以下内容:
var core = require('core');
var location = core.getMyLocation('Petersburg')
.then(function(response) {
// do something with data
}).catch(throw error);

在阅读了 Bluebird 文档和许多关于延迟反模式的博客文章后,我想知道这种模式是否实用。我可以将其更改为以下内容:

核心.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;
});

获取位置.js
var location = core.getMyLocation('Petersburg')
.then(function(response) {
// do something
})
.catch(function(error) {
throw new Error();
});

我想我对拥有一个使用 jquery 处理 xhr 请求的中央库的最佳方式是什么感到困惑,但 Bluebird 用于 promise 。

最佳答案

您可以调用 Promise.resolve 在 jQuery thenable 上并让 Bluebird 同化它:

var res = Promise.resolve($.get(...)); // res is a bluebird Promise

您还可以直接在 Bluebird 链中返回 jQuery Promise 并让它同化它。
myBluebirdApi().then(function(){
return $.get(...);
}).then(function(result){
// The jQuery thenable was assimilated
});

您下面的代码很接近,但您不需要捕获 TimeoutError因为 jQuery ajax 不会抛出这些。至于捕捉取消错误。如果您希望需要取消请求,这无论如何都是您正在做的事情的最佳实践。

关于javascript - 如何在没有延迟反模式的情况下将 jQuery $.ajax 调用转换为 Bluebird promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24315180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com