如何使我的函数调用顺序?

时间:2014-08-16 10:18:18

标签: javascript

我的代码调用一个特定次数的函数,该数量基于循环的数组的当前项,该项是一个数字。因此,如果数组的第一项是9,则该函数被调用9次,之后,无论下一项是什么数字,都将再次调用该函数的次数。

根据数组中的数字,每组调用之间也会有一个暂停。因此,一旦函数被调用了第一个数组项用数字指定的次数,就会有一个暂停,并且该函数再次被调用,表示数组中的第二个项用数字指定的次数。

为了更好地理解,下面的代码调用了函数#34;函数" 8次,然后暂停,然后调用它2次然后暂停,然后15次。这是数组:var theArray = [' 8',' 2',' 15'];所以下面的代码遍历数组的每个项目,并使用每个数组项,这是一个数字,以确定它将调用多少次"函数"功能。这是我的问题,当函数" thefunction"被多次调用,我没有正确执行代码。

我认为这是因为打电话给"功能"不顺序。我如何修改下面的代码,以便在" thefunction"调用一定次数,调用将是顺序的,换句话说,函数将在再次调用之前完成。这样,如果数组中的第一项是数字8,例如"函数"将被调用8次,但实际上每次都能完全执行代码,然后再转到数组中的下一个数字项。

 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); //I'm calling the function called "thefunction" here
function thefunction(){
//my code. it doesn't get executed because calls aren't sequential I think
}

1 个答案:

答案 0 :(得分:1)

队列是否适合解决此问题?您可以将代码分为两部分:一部分将函数添加到队列,另一部分定期检查队列。如果它上面有东西,它会调用该函数。这个例子并不是你情况的精确映射,但它应该证明这种方法:

var queue = [];

// Enqueue a function.
function addFunctionToQueue() { 
    var func = function() { console.log("I'm a queued function"); };
    queue.push(func);
}

// Check the queue for a function, and run it if found. 
function runQueue() { 
    var fn;
    while (fn = queue.shift()) { // [].shift() is undefined, and undefined is falsey
        fn();
    }
    console.log("No more work to do, runQueue() ending.");
}

// Enqueue a function every second, and check the queue every 500ms
setInterval(addFunctionToQueue, 1000);
setInterval(runQueue, 500);

如果生成一个运行传入函数n次的函数并将该函数添加到队列中,那么您可以确保函数将按照您排队的顺序运行。