在所有each()完成之前执行脚本

时间:2012-03-15 23:07:06

标签: jquery each

经过一些调试后,似乎每个语句之后的代码都在每个语句完成之前执行。

我还注意到每个功能都循环了两次。

这就是:

  1. 点击#ProductsSubmit元素
  2. 警告弹出消息:'触发事件' - (#ProductSubmit点击事件仅触发一次。警报框仅弹出一次。)
  3. 通过使用Firefox firebug,我可以看到get函数被调用了4次。只有2个.AddProduct元素。查看包含抓取元素ID的URL时,我可以看到.each()函数循环两次,但请记住#ProductSubmit点击事件只被触发一次。
  4. 第一个警报(ErrorFound)弹出,值为0.我验证了get回调是触发if(VerifyData ['Valid']!='Yes')语句。所以if语句在100%的时间都是真的(用于调试)
  5. 触发Settimeout。警报弹出窗口显示警报(ErrorFound)为1.

  6. 因此,在每个语句中将ErrorFound设置为1之前,似乎会触发警报(ErrorFound)。但是当我对它施加延迟时,它似乎赶上并显示出应该是什么值,即1。

    var ErrorFound;
    
    $(document).ready(function(){
    
    $(document).delegate("#ProductsSubmit", 'click', function(){ 
    alert('Event Triggered');
    ErrorFound = 0;
    $(".AddProduct").each(function(){ 
        var IDToConfirm = $(this).attr('id');
        var SKUToConfirm = $(this).val();
            $("#"+IDToConfirm).removeClass("InputError");
            $.get('http://www.example.com/script.php?s='+SKUToConfirm+'&ut='+IDToConfirm, function(data) { 
                var VerifyData = jQuery.parseJSON(data);
                if(VerifyData['Valid']!='Yes') { ErrorFound = 1; $("#"+VerifyData['ID']).addClass("InputError"); }
            });
    
    
    });
    // Alert box shows value as 0
    alert(ErrorFound);
    setTimeout("AlertError()", 5000);
    
    return false;
    });
    
    });
    function AlertError() {
    // Alert box shows value as 1
    alert(ErrorFound);
    }
    

    发生了什么事?我已经尝试了很多工作,但没有找到任何可行的工作。

2 个答案:

答案 0 :(得分:0)

请记住,无论您的ajax调用状态如何,您的.each循环都将继续运行。 ajax调用响应回调函数,并且不像代码的其余部分那样是程序性的。

当预期只有两次迭代时执行4次调用的问题,这是一个棘手的问题。我会说尝试使用除委托之外的其他选择方法来测试不同但类似场景中的行为(你可以使用.click,.on('click'),. bind('click'),. live('click')< - deprecated)..只需检查一下即可获得更全面的图片。

答案 1 :(得分:0)

您正在被重定向。你真的使用过这个网址吗?