我的代码调用一个特定次数的函数,该数量基于循环的数组的当前项,该项是一个数字。因此,如果数组的第一项是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
}
答案 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
次的函数并将该函数添加到队列中,那么您可以确保函数将按照您排队的顺序运行。