我有一个for循环,它运行一系列函数并调用每个函数。 理想情况下,我想以特定的顺序调用它们,因为一个输出可能会影响其后的输出。 无论如何在没有设定时间间隔或定时器的情况下做到这一点?
抱歉......我想我应该多解释一下......我想到的例子有时可能会使用ajax,这意味着我必须等待ajax成功才能继续。 (其他时候我不需要等待ajax成功)所以我想设置一个条件,如if(成功){继续for循环},其中成功是一个变量设置循环的每个部分的成功。 / p>
答案 0 :(得分:6)
Javascript同步运行,这意味着没有两个函数可以同时执行。只要你按照正确的顺序运行它们,就不应该有任何问题。
在等待ajax响应时,您可以将XMLHttpRequest设置为同步运行(因此,sjax而不是ajax)或设置某种函数迭代器,其工作方式如下:
var FunctionIterator = {
nextFunction: 0,
functionArray: [],
callNext: function ()
{
this.functionArray[this.nextFunction].apply(null, arguments);
this.nextFunction++;
}
}
然后你就像使用它一样:
FunctionIterator.functionArray.push(someFunctionName);
FunctionIterator.functionArray.push(function (arg1) { alert(arg1); });
和
FunctionIterator.callNext(arg1, arg2, arg3);
也许是不言自明的,但每次运行callNext函数时,都会调用下一个函数,并且数组索引会增加1,以便为下一个函数调用做准备。
答案 1 :(得分:0)
如果函数运行异步,你也可以将它们设置为递归调用(代码完全未经测试,只是为了得到这个想法):
var funcarr = [];
function iterfuncs(arr){
arr.pop()();
if(arr.length >=1){
iterfuncs(arr);
}
}
如果您的数组中有很多函数并且担心您的调用堆栈,您可以更改要使用0超时调用的递归调用,这使得调用函数在执行下一个函数之前返回。可怜的勒芒尾递归。
window.setTimeout(function(){ iterfuncs(arr); },0);