我有一块脚本会产生一组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
}
有没有人有解决方案?
答案 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()
为什么你在循环中调用它?可能在循环之前一次更好?!我不知道......