在脚本执行之间添加延迟,尤其是在FOR循环中

时间:2014-11-03 01:55:57

标签: javascript jquery

我有一块脚本会产生一组DOM。它有一个包含异步函数(函数A)的循环,然后是函数B。如果完全执行异步功能(A),将显示功能B的效果。我尝试使用setTimeout函数,但它不能很好地工作,setTimeout之外的某些对象无法在其中访问。
这是脚本:

    var parents     = data.hasil.parent.split(">>");
    var jmlparent   = parents.length;
    for (var i = jmlparent-2; i >= 1; i--){
        add_parent();  // it's the asynchronous function (function A)
        setTimeout(function (){
            $("#parent_"+(jmlparent-i)).val(parents[(i-1)]);  //(function B) 
            //returns error: parents is not defined
        },200);
        //i think 200ms is enough for browser to complete the execution of function A
    }

有没有人有解决方案?

2 个答案:

答案 0 :(得分:2)

函数A应该返回一个promise,当你解决时你会调用函数B.你不知道函数需要多长时间来解决,因此setTimeout()不是一个好方法。

您还需要一个闭包:

var parents     = data.hasil.parent.split(">>");
var jmlparent   = parents.length;
for (var i = jmlparent-2; i >= 1; i--){
    (function( i ) {
        add_parent().done(function() {
            $("#parent_"+(jmlparent-i)).val(parents[(i-1)]);  
        });
    })( i );
}

答案 1 :(得分:1)

我不想讨论setTimeout的使用,只是改进你的代码。试试这个:

...

for (var i = jmlparent-2; i >= 1; i--){
    add_parent();  
    setTimeout(function (a){
        $("#parent_"+(jmlparent-a)).val(parents[(a-1)]);  //(function B) 
    },200, i); // we pass here the i var to setTiemout
}

关于add_parent()为什么你在循环中调用它?可能在循环之前一次更好?!我不知道......