jquery 多个 AJAX 调用;获取所有失败的呼叫

hs1ihplo  于 2023-06-05  发布在  jQuery
关注(0)|答案(1)|浏览(72)

我正在进行多 AJAX 调用,如下所示。下面的代码工作正常,如果所有的调用成功。但是,假设urlId 3和4由于某种原因失败了。是否可以在fail函数中获取 * 所有 * 失败的urlId?

var urlId = [1, 3, 4, 7]
let requests = [];
for (let i = 0; i < urlId.length; i++) {
    requests.push($.ajax(...));
}
$.when.apply($, requests).done(function () {
    $.each(arguments, function (idx, args) {
        //process args : urlId[idx]
    });
}).fail(function (jqXHR) {
    //how to get urlId's failed
});
gstyhher

gstyhher1#

您将无法可靠地获取.fail处理程序中的所有失败ID,因为只要任何一个延迟被拒绝,它就会立即触发,而不管其他延迟的状态如何。
如果你想跟踪哪些请求成功了,哪些失败了,我认为你最好的选择是给每个$.ajax调用附加一个catch处理程序,它将捕获一个失败,并将它Map到一个引用id和成功/失败状态的对象。以这种方式捕获错误将意味着所有的延迟都将成功,因此成功和失败状态的处理将需要在附加到$.whendone处理程序中执行。例如:

var urlId = [1, 3, 4, 7]
let requests = [];

urlId.forEach(id => {
  requests.push(
    $.ajax(/*...*/)
      .then(response => {
        return {
          id,
          success: true,
          response
        };
      })
      .catch(error => {
        return {
          id,
          success: false,
          error
        }
      })
  );
});

$.when.apply($, requests)
  .done(function (values) {
    $.each(arguments, function (idx, obj) {
      console.log(`${obj.id}: success = ${obj.success}`);
    });
 });

Here是供参考的小提琴。

相关问题