Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按顺序排列的多个jQuery承诺_Javascript_Jquery_Promise_Jquery Deferred - Fatal编程技术网

Javascript 按顺序排列的多个jQuery承诺

Javascript 按顺序排列的多个jQuery承诺,javascript,jquery,promise,jquery-deferred,Javascript,Jquery,Promise,Jquery Deferred,基本上我想要这个: 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调用的

基本上我想要这个:

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调用完成时解析。因此,需要像这样调用函数:

 do_ajax_calls(....).done(function(){
   // here is the callback
 })
有人知道我怎么做吗?

给你

var计数器=1;
函数multipleAjax(循环)
{

如果(counter承诺之所以重要的原因之一是因为它们可以链接。您可以利用这一优势,将其他请求迭代链接到前一个请求的解决方案上:

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);
    });
}
函数do\u ajax\u调用(){
var dfd=$.Deferred();
var promise=dfd.promise();
var响应=[];
函数链接请求(url){
承诺=承诺。然后(功能(响应){
响应。推送(响应);
返回$.ajax(url,{method:'POST'});
});
}
for(var i=0,length=arguments.length;i
上面的代码将返回一个最终解析为所有响应数组的承诺。如果任何一个请求失败,该承诺将在第一次失败时拒绝

但是ajax调用的数量取决于我传递给函数(数组)的参数

如果是每个数组项一个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)
是一个“本机”承诺,即在IE中不可用,但我确信jQuery有一个等价的承诺

下面是一个演示

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


我认为,通过某种评估,我可以传递以前构建的字符串,但我不确定这是否是最好的方法。这看起来不起作用。循环中的那些ajax调用都会立即触发?很抱歉,我吹毛求疵,但我认为这也不起作用,因为url变量在内部函数中。我认为它会e未定义。我知道,因为我经历过这个问题。你有一个观点,尽管变量不是未定义的。我这里有一个愚蠢的竞争条件,我无法在小提琴中看到,因为我每次发送相同的URL。我再次修复了它。这个答案违背了承诺的观点,即链接和可组合性。这没有区别租金比使用纯粹的回调要高。
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));
}
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)
});