我想调用一个函数特定次数。我希望我的函数在数组中被调用的次数如下所示。我有一个遍历数组的 for 循环,我正在尝试调用名为“thefunction”的函数 与数组项中的数字一样多。所以数组中的第一项是 8,所以我首先希望“thefunction”函数被调用 8 次,这意味着我应该看到警告消息“thefunction”将显示 8 次,然后 2 次,因为 2 是中的下一项然后阵列 15 次。我还想在每组通话之间暂停片刻。因此,在函数被调用 8 次之后,它会在调用函数 2 次之前暂停片刻,然后在调用函数 15 次之前再次暂停,如此等等。到目前为止,这是我的代码。
var thearray = ['8','2','15'];
for(j=0; j < thearray.length; j++){
num = thearray[j];
var counter = 1;
(function foo() {
thefunction();// function I'm calling
if (counter < num) {
counter++;
setTimeout(foo, 400);
}
})();
}
function thefunction (){
alert('test');
}
最佳答案
您不能将 for
循环与变量 j
一起使用并使用异步 setTimeout()
。 for
循环将运行完成,并且 j
变量在 setTimeout()
运行之前已经增加。这是尝试在异步函数中使用 for
循环索引的经典问题。
我不明白你想要完成什么,所以我不确定要建议什么代码。你有三个值(value)观。您是否尝试执行两个循环,一个遍历数组,一个处理每个数组值?你能更好地解释一下最终输出应该是什么吗?
我在这里猜测,但如果你想做的是调用你的函数 8 次,然后暂停,然后 2 次然后暂停,然后 15 次,然后完成,你可以这样做:
function runArray(arr, fn) {
// initialize array index - can't use for loop here with async
var index = 0;
function next() {
var cnt = +arr[index];
for (var i = 0; i < cnt; i++) {
fn(index, cnt);
}
// increment array index and see if there's more to do
++index;
if (index < arr.length) {
setTimeout(next, 400);
}
}
// start the whole process if the array isn't empty
if (arr.length) {
next();
}
}
var theArray = ['8','2','15'];
runArray(theArray, thefunction);
工作演示:http://jsfiddle.net/jfriend00/Loycmb3b/
仅供引用,如果您要放入数组中的内容要用作数字,最好将它们作为数字而不是字符串放入数组中。我已经让我的代码以任何一种方式工作,但是当你指的是数字时,使用数字的代码效率更高,代码也更好。
关于javascript - 我怎样才能让这个函数被调用特定次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25319891/