Javascript 在循环中执行ajax查询,然后使用组合输出的函数
我有一个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 =
.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()。有趣的把戏!答对 了这种方法完美而优雅。