Javascript Jquery AJAX承诺在AJAX失败时总是中断

Javascript Jquery AJAX承诺在AJAX失败时总是中断,javascript,jquery,ajax,promise,Javascript,Jquery,Ajax,Promise,我有一个包含多个ajax请求的循环。 每个ajax都通过始终回调进行管理。 每个ajax都被推送到一个数组中。 最后,$.when在“始终”上使用 如果所有的$.ajax都获得成功,$.when.apply($,promises).always(…) 当所有$.ajax调用成功时调用 但例如在3$.ajax调用第二个失败时,$.when.apply($,promises).always(…)仅在第二次调用后触发,而不是在所有3$.ajax调用成功时触发 有什么帮助吗? 遵循代码 $(".uplo

我有一个包含多个ajax请求的循环。 每个ajax都通过始终回调进行管理。 每个ajax都被推送到一个数组中。 最后,$.when在“始终”上使用

如果所有的
$.ajax
都获得成功,
$.when.apply($,promises).always(…)
当所有
$.ajax
调用成功时调用

但例如在3
$.ajax
调用第二个失败时,
$.when.apply($,promises).always(…)
仅在第二次调用后触发,而不是在所有
3$.ajax
调用成功时触发

有什么帮助吗? 遵循代码

$(".upload_all").bind("click", function() {
  var confirmed_count = 0;
  var error_count = 0;
  var promises = [];

  to_uploads.each(function(index,val) {
    var elem = $(this);
    var promise = $.ajax({
      url: "/upload/storeUploadedFile",
      type: 'POST',
    }).always(function(data_or_jqXHR, textStatus, jqXHR_or_errorThrown) {
      if (textStatus === "success") {
        // ..
      } else {
        // ..
      }                  
    });

    promises.push(promise);
  });

  $.when.apply($, promises)
    .always(function() {
      console.log("Promises Always! ") // do other stuff
    });
}

正如@kevin-b所提到的,
$返回时的承诺(与
承诺几乎相同。如果传递给它的任何承诺被拒绝,则所有
)都将被拒绝。您可能希望这样做,以通知用户某些上载不成功

但是
$.ajax(..).always
(与
承诺相同。最后
)表示“在拒绝或解决此承诺时执行此回调”。您可能希望在所有ajax调用成功时执行某些操作,或者在其中任何一个调用失败时执行其他操作。使用
Promise.all(promises)。然后(…).catch(…)

$(".upload_all").bind("click", function() {
  var confirmed_count = 0;
  var error_count = 0;

  var promises = to_uploads.map(function(index,val) { // using map instead of each here saves us a couple of steps
    var elem = $(this);

    return $.ajax({
      url: "/upload/storeUploadedFile",
      type: 'POST',
    })
      .then(function() { confirmed_count += 1; })
      .catch(function() {
        error_count += 1;
        return Promise.reject(); // Return a rejected promise to avoid resolving the parent promise
      });
  });

  // You can use the native API here which does not require doing the `apply` hack
  Promise.all(promises)
    .then(function() { alert('All uploads successful'); })
    .catch(function() { alert(`Successful uploads: ${confirmed_count}. Failed uploads: ${error_count}`); }
}
记住JQuery使用承诺的替代实现,但它们仍然响应本机API:

  • .then
    .done
    在jqueryflavor中):附加一个回调,以便在成功时运行
  • .catch
    .fail
    在JQuery风格中):附加一个回调以在出现错误时运行。除非退回被拒绝的承诺,否则这将解决该承诺
  • .finally
    .always
    在JQuery风格中):附加一个回调,在任何其他回调运行之后运行,尽管承诺被拒绝或解决

是否始终与jquery承诺相关?是的,我想我从来没有在那种情况下用过。jquery 1.6+好的,那么,现在发生的是您的$.when()创建了一个解析或拒绝的承诺。如果其中一个承诺被拒绝,整个事情会立即被拒绝,跳过任何尚未完成的承诺。这意味着你有一个承诺,如果没有实现,那么这个承诺就是失败的。如果您想等待它们全部运行而不考虑失败,则必须截获失败并将其转换为成功。在我的评论中//do other stuff,我希望仅用一个摘要提示用户成功上载和失败上载。你说“意味着‘当这个承诺被拒绝或解决时执行这个回调’”,但这并没有像我试图解释的那样发生,因为当一个ajax失败时,回调被触发。例如,你可以迭代我的更改,并将失败的API调用的引用推送到数组中。您不能总是使用
,因为它会在所有AJAX调用成功或任何调用失败时触发。寻找编辑。