gpt4 book ai didi

jquery - 重试失败的 jQuery.ajax 请求

转载 作者:行者123 更新时间:2023-12-01 01:07:57 24 4
gpt4 key购买 nike

我需要创建一个函数,重试失败的 ajax 请求,直到达到给定的限制,但是我需要确保只有在超过最大重试次数时才会拒绝 promise ,如下所示:

function my_ajax(...) { ... }

// then I use it this way
return $.when(my_ajax('foo.json'), my_ajax('bar.json'))

为了使用 jQuery.when,my_ajax 只应返回一个 Promise,该 Promise 应该在内部 jQuery.ajax 解析时解析,仅当重试次数达到最大时才拒绝。制作。

我编写的代码是这样的:

function do_ajax(args, dfd, attempt) {
dfd || (dfd = $.Deferred());
attempt || (attempt = 1);

$.ajax(args).then(dfd.resolve, function(xhr, text_status, error_thrown) {
console.error(/* something useful */);
attempt++;

if(attempt > 3) {
dfd.reject(xhr, text_status, error_thrown);
} else {
do_ajax(args, dfd, attempt);
}
});

return dfd.promise();
}

// in some random code
return $.when(do_ajax({url:'foo.json'}), do_ajax({url:'bar.json'});

这对我有用*,但有点难以理解。问题是:有没有更好(并且更容易阅读)的方法来做到这一点?

* - 实际上我并没有测试有时会失败,但是当第一个ajax请求成功时我工作得很好。

最佳答案

我认为您的代码是正确的方法,将您的调用包装在新的 Deferred 中并返回它,直到达到所有尝试为止。

您可以尝试将递归调用包含在匿名函数中以提高可读性。

我是这样写的:

function doAjax(ajaxArgs, attempt) {
// the wrapped returned dfd
var wrappedDfd = $.Deferred();

// your nested call using attempt counter
(function nestedCall() {
// if call succed, resolve the wrapped dfd
$.ajax(ajaxArgs).then(wrappedDfd.resolve, function() {
// update attempt counter
attempt--;
if (attempt > 0) {
// try another call
nestedCall();
} else {
// max try reached, reject wrapped dfd
wrappedDfd.reject();
}
});
})();

return wrappedDfd.promise();
};

这与您的代码非常相似。

这是jsfiddle 。出于测试目的,我用模拟工厂调用替换了 doAjax 参数,但代码保持不变。

希望这有帮助。

关于jquery - 重试失败的 jQuery.ajax 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17349127/

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