10

使用 Javascript 我需要能够:

1:将一定数量的相同函数(每个函数有不同的参数)推入一个数组。

2:然后一个一个地运行每个函数(对于这个例子只是参数/数字的警报)

3:在每个函数之后,我需要能够从数组中拼接该函数

4:每次后检查数组长度 - 一旦数组再次为空 - 提醒用户它已完成

现在我似乎能够完成任务 1,2 和 4,但我正在为如何在运行后从数组中拼接出函数而苦恼 - 有人可以帮忙吗?由于我无法删除该功能,因此一旦调用了所有功能,我就永远不会收到“完成”警报

到目前为止,我的 javascript 代码是:

// Create empty array
var array = [];

// Push functions into array - dynamic amount and could be any amount of functions
array.push(func(1));
array.push(func(2));
array.push(func(3));

// Call array manager function after pushing array
arrayManager();

// Array manager function to splice and detect when finished
function arrayManager() {
    if (array.length < 1) {
        alert("done");
    }
    else {
    //////////////////////////////////
    // << THIS IS WHERE I DON'T KNOW HOW TO SPLICE THE ITEM FROM THE ARRAY
    //////////////////////////////////
    }
}

// Function for array objects - alert passed parameter
function func(num){
    alert(num);
}
4

5 回答 5

20

首先,您现在没有将函数推送到数组中,而是执行 func 。要实现推送,您的 func 应如下所示:

// Function for array objects - alert passed parameter
function func(num){
  return function(){
    alert(num);
  }
}

现在,如果您的函数是同步的,您可以简单地遍历数组

for(var i in arr){
  arr[i]();
}
console.log('done');

如果我们正在处理异步函数,那么它们需要有一个回调:

// Function for array objects - alert passed parameter
function func(num){
  return function(callback){
    alert(num);
    callback();
  }
}

然后您可以使用计数器并行运行。

var count = arr.length;
for(var i in arr){
  arr[i](function(){
    if(--count === 0){
      console.log('Done');
    }
  });
}

或按顺序:

function run(){
  var fn = arr.shift();
  if(!fn){
    console.log('Done');
  } else {
    fn(run);
  }
}
run();
于 2012-09-24T20:09:50.200 回答
2

这应该可以满足您的需求:

var next_func = array.splice(0, 1)[0]

"splice" 至少有两个参数:第一个是开始删除的索引,第二个是要删除的项目数。当它返回一个新数组时,只需获取从拼接中获取第一个值的函数。您还可以在前两个参数之后添加任意数量的值;这些将被添加到数组中以代替您删除的内容。

但是,我很好奇你为什么这样做——虽然我可以理解以非传统方式做某事是一种智力练习,但如果你是编程新手,我会说有更好的方法来做到这一点。当您使用其中的函数时,没有特别需要从数组中删除项目。对我来说,从数组中执行每个函数,然后在完成循环后设置“array = []”会更有意义。但是,根据情况,这可能仍然是做你正在做的事情的最佳方式,我只是想我会给一些思考。

于 2012-09-24T19:47:50.437 回答
2
// Create empty array
var array = [];

// Push functions into array - dynamic amount and could be any amount of functions
array.push(function() { func(1); });
//if you call array.push(func(1)) the function is executed immediatly
//then null is stored in the array
array.push(function() { func(2); });
array.push(function() { func(3); });

// Call array manager function after pushing array
arrayManager();

// Array manager function to splice and detect when finished
function arrayManager() {
    while (array.length){
        var fnc=array.splice(0,1)[0]
        fnc();
    }
    alert ("done");            
}

// Function for array objects - alert passed parameter
function func(num){
    alert(num);
}​
于 2012-09-24T20:09:22.150 回答
2

这是你需要的吗?

1:将一定数量的相同函数(每个函数有不同的参数)推入一个数组。

function func(num){
    alert(num);
}

var k = [];
k.push({f:func, params:[1]});
k.push({f:func, params:[2]});
k.push({f:func, params:[3]});

2:然后一个一个地运行每个函数(对于这个例子只是参数/数字的警报)

3:在每个函数之后,我需要能够从数组中拼接该函数

4:每次后检查数组长度 - 一旦数组再次为空 - 提醒用户它已完成

while (k.length > 0) {
 k[0].f(k[0].params);
 k.shift();
}
alert("done");
于 2012-09-24T20:09:43.713 回答
1

http://jsfiddle.net/nZ459/1/

如果你想以你正在做的方式推送每个函数及其参数,你必须像这样包装函数:

function wrapper(arg){
    return function(){
        console.log(arg);
    };
}


var ar = [];

console.log("pushing functions");

ar.push(wrapper(1));
ar.push(wrapper(2));
ar.push(wrapper('three'));

console.log("done pushing functions");

while (ar.length){
    var fn = ar.shift();
    console.log("calling ", fn);
    fn();
}

或者,您可以制作一个通用包装器,该包装器接受一个函数,并将参数作为参数,并返回一个匿名函数。

为了更直接地回答您的问题,以您想要的方式遍历数组的最简单方法是这样的:

while (array.length){
    var item = array.shift();
    ...
}
于 2012-09-24T20:16:14.083 回答