10

Javascript を使用すると、次のことができる必要があります。

1: 一定量の同じ関数 (それぞれに異なるパラメーターを持つ) を配列にプッシュします。

2: 次に、各機能を 1 つずつ実行します (この例では、パラメーター/番号のアラートのみ)。

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);
}
4

5 に答える 5

20

まず第一に、現時点では関数を配列にプッシュしていません。代わりに関数を実行します。プッシュを実現するには、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]

「スプライス」は少なくとも2つのパラメータを取ります。1つ目は削除を開始するインデックスで、2つ目は削除するアイテムの数です。新しい配列を返すので、関数を取得するには、スプライスから最初の値を取得します。これらの最初の2つのパラメーターの後に、必要な数の値を追加することもできます。これらは、削除したものの代わりにアレイに追加されます。

しかし、なぜあなたがこのようにやっているのか興味があります-知的演習として型破りな方法で何かをすることは理解できますが、プログラミングに不慣れな場合は、これを行うためのより良い方法があると思います。配列から関数を使用するときに、配列から項目を削除する必要は特にありません。私にとっては、配列から各関数を実行し、ループの完了後に「array=[]」を設定する方が理にかなっています。ただし、状況によっては、これがあなたがしていることを行うための最良の方法である可能性があります。

于 2012-09-24T19:47:50.437 に答える
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: 次に、各機能を 1 つずつ実行します (この例では、パラメーター/番号のアラートのみ)。

3: 各関数の後、その関数を配列から SPLICE できるようにする必要があります

4: 毎回配列の長さを確認します - 配列が再び空になったら - 完了したことをユーザーに警告します

while (k.length > 0) {
 k[0].f(k[0].params);
 k.shift();
}
alert("done");
于 2012-09-24T20:09:43.713 に答える
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 に答える
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 に答える