Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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 在循环中执行ajax查询,然后使用组合输出的函数_Javascript_Jquery_Ajax - Fatal编程技术网

Javascript 在循环中执行ajax查询,然后使用组合输出的函数

Javascript 在循环中执行ajax查询,然后使用组合输出的函数,javascript,jquery,ajax,Javascript,Jquery,Ajax,我有一个ajax查询,后面跟着一些函数,我使用.then()promise回调按顺序执行它们: var pictures = []; var venues = **an array of venues** $.get(url).then(functionA, functionFail).then(function B); 但functionA是第一个成功回调,它包含一个触发“n”个ajax请求的循环: for(var i=0; i<n; i++) { var venue =

我有一个ajax查询,后面跟着一些函数,我使用
.then()
promise回调按顺序执行它们:

var pictures = [];
var venues = **an array of venues**

$.get(url).then(functionA, functionFail).then(function B);
但functionA是第一个成功回调,它包含一个触发“n”个ajax请求的循环:

for(var i=0; i<n; i++) { 
    var venue = venues[i];
    var new_url = **some_url**

    $.ajax({url: new_url, async: false}).done(function(data) {
        var pics = data.response.photos.items;
        pictures.push(pics[0]);
        pictures.push(pics[1]);
      }).fail(function() {
      console.log('Failed!');
    });
}

for(var i=0;i当您使用jQuery时,它看起来可以获取多个结果,然后在所有结果都解决后调用done。

不确定这是否是最佳答案,但这是其中之一!只需计算请求完成的次数,当所有结果都完成时,执行您的函数

var completed_requests = 0,
    returned_data = [];

for (var i=0; i<n; i++) { 
    var venue = venues[i];
    var new_url = **some_url**
    var done = function(data_array) {
        var pics = [];
        data_array.forEach(function(data) {
            pics = pics.concat(data.response.photos.items);
        });
      };

    $.ajax({url: new_url}).done(function(data) {
        completed_requests++;
        returned_data.push(data);
        if (completed_requests == n) {
            done(returned_data);
        }
    }).fail(function() {
      console.log('Failed!');
    });
}
var已完成\u请求=0,
返回的_数据=[];

对于(var i=0;i您可以自己处理循环,一次只在
场馆
中处理一个项目。完成一个项目后,调用一个函数来处理下一个项目,当场馆为空时,再调用您的
函数B

ar pictures = [];
var venues = **an array of venues**

$.get(url).then(functionA, functionFail);

function functionA() {
  var venue = venues.shift();
  var new_url = **some_url**;

    $.ajax({
            url: new_url, 
            async: true
          }).done(function(data) {
            var pics = data.response.photos.items;
            pictures.push(pics[0]);
            pictures.push(pics[1]);
            if(venues.length !== 0) {
                functionA();
            }
            else {
                functionB();
            }
          }).fail(function() {
          console.log('Failed!');
    });
}

您可以使用
Promise.all
,函数A的代码:

var请求=[]
对于(var i=0;i{
$.ajax({url:new_url}).done(函数(数据){
var pics=data.response.photos.items;
解析(pics)
}).失败(功能(错误){
拒绝(错误)
console.log('Failed!');
});
}))
}

return Promise.all(requests)
可能会添加一个计数器,对每个请求的成功进行计数,如果计数器达到n?@yadejo,则执行functionB,而这在这里不起作用。:)这可能会对您有所帮助。它使用一个URL数组,每个URL都用于一个承诺中,所有URL都被传递到
$中。当
@Andy在一个答案提示后立即尝试这种方法时。谢谢这听起来很有希望。我将不得不重新构造我的代码,让我试试这个!:)@Andy@Axnyff啊,我试过了,但对我来说这不是最好的方法。:)问题是,这种方法要求您确切地知道自己发出了多少请求(用于将参数传递给
$.when()
)。在我的例子中,请求的数量是可变的,它不允许我传入一个ajax请求对象数组(这可能会起作用!)。因此,我现在只使用同步请求和超时,尽管这是一种变通方法,并不十分优雅/您不能创建一个包含所有承诺的数组,然后创建jQuery.when.call(jQuery,myArray)吗?嘿,谢谢!只是想让你知道,我发现克米特的建议最符合我的需要。:)我现在使用的是Promise.all(),它现在非常简单。我已经试过了,这很直观,但效果不太好。:)使用这种方法,我需要让函数B‘listen’用于变量
completed\u requests
,以达到某个特定值,在此之前,浏览器在某些情况下可能会冻结!你不需要“听”它!仅在请求完成时检查该值,因为这是更改completed_requests值的唯一时间。而且浏览器不会冻结。哦,我看到您稍微修改了代码-我将尝试使用新数据从函数中调用done()。有趣的把戏!答对 了这种方法完美而优雅。