多个 jQuery 承诺按顺序

Multiple jQuery promises in sequential order

基本上我想要这个:

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 调用的次数取决于我传递给函数的参数,它是一个数组,所以我不能使用那个代码。

该函数应该 return 一个仅在最后 ajax 调用完成时才解析的承诺。所以函数需要这样调用:

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

有人知道我该怎么做吗?

在这儿Demo

var counter = 1 ;

function multipleAjax(loop)
{
   if(counter<loop)
   {
        $.ajax(
        {
            url: 'http://mouadhhsoumi.tk/echo.php',
            success:function(data)
            {
                multipleAjax(loop);
                $(".yo").append(data+"</br>");
                counter++;
            }
        });

   }
}
multipleAjax(5);

promise 之所以重要的原因之一是因为它们可以被链接起来。您可以利用此优势将其他请求迭代链接到前一个请求的解决方案:

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);
    });
}

以上代码将 return 最终解析为所有响应的数组的承诺。如果任何一个请求失败,承诺将拒绝第一次失败。

JSFiddle

But the number of ajax calls depends on the arguments that I pass to the function, which is an array

如果每个数组项 ajax 调用一次

function do_ajax_calls(args) {
    return args.reduce(function(promise, item) {
        return promise.then(function() { 
            return $.ajax(args); // should that be item?
        });
    }, Promise.resolve(true));
}

Promise.resolve(true) 是一个 "native" 承诺,即在 IE 中不可用,但我确定 jQuery 有一个等效的

这是一个JSFiddle演示

尝试使用 $.when()Function.prototype.apply()$.map()

function do_ajax_calls(args) {
  return $.when.apply($, $.map(args, function(request, i) {
    return $.ajax(request) // `request` : item with `args` array
  }))
}

do_ajax_calls
.then(function success() {
  console.log(arguments)
}, function err() {
  console.log("err", arguments)
});