首页 > 解决方案 > 使用 jQuery.when 处理浏览器未发送的请求

问题描述

编辑

好的,所以我最终使用了 axios。它可以正确处理所有内容,甚至是$.when.

我避免使用 axios,因为我的应用程序中已经有 jQuery。


$.when用来等待动态数量的 ajax 请求。如果所有请求都已发送(完成或失败),则代码工作正常,但我注意到如果一个请求被阻止(例如,chrome 由于 CORS 策略阻止了一个请求),那么$.when即使其他请求没有完成,它似乎也会失败并且只会运行然而。

devices.forEach((device) => {
  requestArr.push(
    $.ajax({
      url: `http://${device.ip_address}:3000/s`,
      type: "GET",
      timeout: 3000,
    })
      .done((data, textStatus, xhr) => {
        aliveDevices.push(device);
      })
      .fail((data, textStatus, xhr) => {
        deadDevices.push(device);
      })
  );
})
$.when.apply(null, requestArr).always(function () {
   console.log("Alive Devices: " + aliveDevices.length);
   console.log("Dead Devices: " + deadDevices.length);
});

在我当前的测试中,我有 4 个请求,2 个请求会正常运行,1 个会失败,1 个会因为 CORS 策略而被 chrome 阻止。正如你在这张图片中看到的,预期的输出应该是 Alive 2, Dead 2,或者至少如果请求没有被发送,那么 Alive 2, Dead 1。 请求被阻止

在第二张图片中,我删除了对被阻止的 URL 的请求。现在我得到了正确的输出。

没有被阻止的请求

标签: javascriptjqueryajax

解决方案


推荐阅读