javascript – 按顺序排列的多个jQuery承诺

基本上我想要这个:

function do_ajax_calls(...){
  var d = $.Deferred();

  $.ajax(args).done(function(){

    $.ajax(args).done(function(){

      $.ajax(args).done(function(){
         d.resolve();
      });

    });

  })

  return d.promise();
}

但是ajax调用的数量取决于我传递给函数的参数,这是一个数组,因此我无法使用该代码.

该函数应返回仅在最后一次ajax调用完成时解析的promise.所以函数需要像这样调用:

 do_ajax_calls(....).done(function(){
   // here is the callback
 })

有谁知道我该怎么做?

解决方法:

承诺的原因之一是一个很大的原因是因为它们可以被链接.您可以利用此优势迭代地将其他请求链接到上一个请求的解析:

function do_ajax_calls() {
    var dfd = $.Deferred();
    var promise = dfd.promise();
    var responses = [];

    function chainRequest(url) {
        promise = promise.then(function (response) {
            responses.push(response);
            return $.ajax(url, { method: 'POST' });
        });
    }

    for (var i = 0, length = arguments.length; i < length; i++) {
        chainRequest(arguments[i]);
    }

    dfd.resolve();

    return promise.then(function (response) {
        return responses.slice(1).concat(response);
    });
}

上面的代码将返回一个最终解析为所有响应数组的promise.如果任何一个请求失败,则承诺将在第一次失败时拒绝.

JSFiddle

相关文章

最后的控制台返回空数组.控制台在ids.map函数完成之前运行va...
我正在尝试将rxJava与我已经知道的内容联系起来,特别是来自J...
config.jsconstconfig={base_url_api:"https://douban....
我正在阅读MDN中的javascript,并且遇到了这个谈论承诺并且不...
config.jsconstconfig={base_url_api:"https://douban....
这是我的代码main.cpp:#include<string>#include<...