使用Javascript我需要能够:
1:将一定数量的相同功能(每个参数中的参数不同)推入数组。
2:然后逐个运行每个函数(本例中只是参数/数字的警告)
3:在每个函数之后,我需要能够从数组中SPLICE那个函数
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);
}
答案 0 :(得分:14)
首先,你不是要将函数推入数组,而是执行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();
答案 1 :(得分:1)
这应该做你想要的:
var next_func = array.splice(0, 1)[0]
“splice”至少需要两个参数:第一个是开始删除的索引,第二个是要删除的项目数。当它返回一个新数组时,只需获取该函数,就可以从拼接中获得第一个值。在前两个参数之后,您还可以添加任意数量的值;这些将被添加到数组中以代替您删除的内容。
然而,我很好奇为什么你这样做 - 虽然我能理解以非常规方式做一些事情作为一种智力练习,如果你是编程的新手,我会说有一个更好的方法这个。当您使用它中的函数时,没有特别需要从数组中删除项目。对我来说,从数组中执行每个函数更有意义,然后在完成循环后设置“array = []”。然而,根据情况,这可能仍然是你做你正在做的事情的最佳方式,我只是觉得我会给你一些思考。
答案 2 :(得分:1)
// 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);
}
答案 3 :(得分:1)
这是你需要的吗?
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:在每个函数之后,我需要能够从数组中SPLICE那个函数
4:每次检查数组长度 - 一旦数组再次为空 - 提醒用户它已完成
while (k.length > 0) {
k[0].f(k[0].params);
k.shift();
}
alert("done");
答案 4 :(得分:0)
如果你想以你正在做的方式推送每个函数及其参数,你必须像这样包装函数:
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();
...
}