Jquery 如何让代码等待循环中的所有代码执行后再继续?
我正在使用jqueryJquery 如何让代码等待循环中的所有代码执行后再继续?,jquery,callback,each,Jquery,Callback,Each,我正在使用jquery遍历一组html元素,每个元素都。在每次迭代中,我调用一个get。我希望跟踪成功的GET并在最后输出一个计数 var numSuccessful = 0; $('.mySelector').each(function(){ $.get('/myCfc.cfc?method=doSomething&id=' + $(this).attr('id'), function(data){ numSuccessful++;
遍历一组html元素,每个元素都。在每次迭代中,我调用一个get
。我希望跟踪成功的GET并在最后输出一个计数
var numSuccessful = 0;
$('.mySelector').each(function(){
$.get('/myCfc.cfc?method=doSomething&id=' + $(this).attr('id'),
function(data){
numSuccessful++;
});
});
alert(numSuccessful + ' successful');
此代码的问题在于,each方法启动所有get调用,然后在完成get之前以及更新numSuccessful变量之前继续执行警报。在一次测试运行中,我以“0成功”而不是“4成功”结束,因为警报执行得太快。我怎样才能让代码等到所有操作完成后再继续?整个“each”语句是否有成功回调
var numSuccessful = 0;
var totalSelectors = $('#mySelector').length;
$('#mySelector').each(function(){
$.get('/myCfc.cfc?method=doSomething&id=' + $(this).attr('id'),
function(data){
numSuccessful++;
if(!totalSelectors--) doneSelectors();
});
});
function doneSelectors() {
alert(numSuccessful + ' successful');
}
注意:上述功能不能正常工作!$.get()
不会在出现错误时发出通知,因此如果出现任何错误,最终函数将永远不会运行
相反,您需要将其转换为使用$.ajax()
函数。并定义成功和失败回调。如果您需要帮助,请告诉我。您可以使用递归函数,请尝试以下操作:
var num = 0;
var $ms = $('.mySelector');
function go() {
$.get('/myCfc.cfc?method=doSomething&id='+$ms.eq(num).attr('id'),
function(data){
num++;
if ((num-1) == $ms.length) callback(); else go();
}).error(callback)
}
function callback(){
alert(num)
}
go()
您可以使用$.ajax
返回的承诺设置如下灵活的回调队列:
var requests = []; //Array containing all the ajax calls
for (var i = 0; i < 9; i++) {
requests.push(
$.ajax({
url: '/echo/html', //this is because of jsfiddle.net
type: 'post', //this one too
success: function() {
//whatever
}
}));
}
$.when.apply($, requests).then(function() { //.apply is needed as we want to pass an Array
//called when all requests are done
}).fail(function(){ //this will be triggered when one of the requests fails
//error handling can go here
});
只需将$.get
替换为$.ajax
,并将async
设置设置为false
$.ajax({
url : '/myCfc.cfc',
data : { 'method' : 'doSomething' , 'id' : $(this).attr('id') },
async : false,
success : function(data){
numSuccessful++;
}
});
通过执行此操作,脚本将等待得到响应。您可以使用或-您熟悉这种JS吗?$(“#mySelector”)。每一个都是?id必须是唯一的,您的选择器只选择id为mySelector
的第一个元素。我使用两个函数循环解决了一个类似的问题:一个外部计数器跟踪元素,“each”构造块的内容作为一个函数,完成后调用回调函数,如果计数器低于元素的nr,则回调将再次执行第一个函数。@undefined-抱歉,这是一个输入错误。应该是$('.mySelector'),我会更新。@m90-不,你能详细说明一下吗?也许你的意思是.error(callback)
而不是.error(callback())
?谢谢,这很有效-你的代码中只有一个语法错误,你需要在ajax调用主体周围加上花括号
$.ajax({
url : '/myCfc.cfc',
data : { 'method' : 'doSomething' , 'id' : $(this).attr('id') },
async : false,
success : function(data){
numSuccessful++;
}
});