如何将此功能调用特定次数?

时间:2014-08-15 01:10:31

标签: javascript

我想将函数调用特定次数。我希望我希望在一个数组中调用我的函数的次数如下所示。我有一个遍历数组的for循环,我试图调用名为&#34的函数;函数" 与数组项中的数字一样多的次数。所以数组中的第一项是8,所以我首先想要"函数"函数被调用8次,这意味着我应该看到警告消息"函数"将显示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');
}

1 个答案:

答案 0 :(得分:2)

您不能将for循环与变量j一起使用,并使用异步setTimeout()for循环将运行完成,j变量在setTimeout()运行之前已经增加。这是尝试使用异步函数中的for循环索引的典型问题。

我并不完全明白您要完成的工作,因此我不确定要提供什么样的代码。你有三个价值观。您是否尝试执行两个循环,一个用于遍历数组,另一个用于处理每个数组值?你能更好地解释最终输出应该是什么吗?


我在这里猜测,但如果您要做的是将您的功能召唤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/

仅供参考,如果您在阵列中放置的内容是用作数字,那么最好将它们作为数字放入数组中,而不是字符串。我已经使我的代码工作方式,但它更高效,只是更好的代码,当你的意思是数字时使用数字。