如何在多个AJAX调用的fail函数中获取所有失败的urlId?
如何在多AJAX调用失败时获取所有失败的urlId
你当前的代码在所有AJAX调用成功时能正常运行,但$.when()的fail回调只会在第一个失败的请求触发时立即执行,无法获取后续失败的请求对应的urlId。要收集所有失败的urlId,可以通过以下两种方式实现:
方法一:单独绑定每个请求的失败回调,收集失败ID
给每个AJAX请求单独绑定fail回调,将对应的urlId存入数组,最后在所有请求完成后统一处理:
var urlId = [1, 3, 4, 7]; let failedIds = []; let requests = []; for (let i = 0; i < urlId.length; i++) { const id = urlId[i]; const request = $.ajax(...) // 替换为你的AJAX配置 .fail(() => { failedIds.push(id); }); requests.push(request); } // 等待所有请求完成(无论成功失败) $.when.apply($, requests).always(function() { if (failedIds.length > 0) { console.log("失败的urlId:", failedIds); // 在这里处理失败的ID逻辑 } else { // 所有请求成功时的处理逻辑 $.each(arguments, function(idx, args) { // process args : urlId[idx] }); } });
方法二:用Promise.allSettled统一处理结果
如果你的运行环境支持ES6 Promise,可以利用Promise.allSettled()(jQuery的AJAX返回对象兼容Promise标准),将每个请求的结果与对应的urlId绑定,最后过滤出失败的条目:
var urlId = [1, 3, 4, 7]; let requests = urlId.map(id => { return $.ajax(...) // 替换为你的AJAX配置 .then(response => ({ id, status: 'fulfilled', value: response })) .catch(error => ({ id, status: 'rejected', reason: error })); }); Promise.allSettled(requests) .then(results => { // 提取所有失败的urlId const failedIds = results .filter(item => item.status === 'rejected') .map(item => item.id); if (failedIds.length > 0) { console.log("失败的urlId:", failedIds); // 处理失败逻辑 } else { // 所有请求成功时的处理 results.forEach((result, idx) => { // process result.value : urlId[idx] }); } });
关键说明
原来的$.when().fail()逻辑存在局限性:只要有一个请求失败,fail就会立即触发,不会等待其他请求完成,因此无法获取后续失败的urlId。上面两种方法都是等待所有请求完成后再统计失败的ID,解决了这个问题。
内容的提问来源于stack exchange,提问作者Suresh
相关产品推荐
相关产品推荐

