Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.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
Jquery 如何让代码等待循环中的所有代码执行后再继续?_Jquery_Callback_Each - Fatal编程技术网

Jquery 如何让代码等待循环中的所有代码执行后再继续?

Jquery 如何让代码等待循环中的所有代码执行后再继续?,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++;

我正在使用jquery
遍历一组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++;
    }
});