4

非同期関数を取得しました:

var func = function  (arg, next) {
    var milliseconds = 1000;
    setTimeout(function(){
        console.log (arg);
        next()
    }   , milliseconds);
}

そして配列:

var arr = new Array();
arr.push (0);
arr.push (1);

console.log(arr);

func配列のすべてのアイテムに使用したいarr

func(arr[0], function(){
    func(arr[1], function(){
        console.log("finish");
    })
})

配列は2つの要素で構成されていましたが、1000要素の配列を取得した場合func、のすべてのアイテムにどのように使用しarrますか?

サイクルでそれを行う方法は?

4

7 に答える 7

3
var arrayFunc = function(array) {
  if (array.length > 0) {
    func(array[0], function() { arrayFunc(array.slice(1)); });
  }
}

これにより、配列の最初の要素で関数が実行され、継続関数が配列の残りを取得します。したがって、実行すると、配列内の新しい最初の要素が実行されます。

編集:これは、配列をコピーしない変更されたバージョンです:

var arrayFunc = function(array, index) {
  if (index < array.length) {
    func(array[index], function() {
      var newI = index + 1;
      arrayFunc(array, newI);
    });
  }
}

そして、最初はインデックス 0 で呼び出すだけです。

于 2013-07-25T14:01:57.277 に答える
0

簡単な解決策は次のとおりです。

var fn = arr.reduceRight(function (a, b) {
  return func.bind(null, b, a);
}, function() {
  console.log('finish');
});

fn();

デモ: http://jsbin.com/isuwac/2/


または、funcのパラメータの順序を変更してコールバックを最初のパラメータとして受け取ることができる場合、次のnextように簡単にできます。

['a', 'b', 'c'].reduceRight(func.bind.bind(func, null), function (){
  console.log('finish');
})();

デモ: http://jsbin.com/ucUZUBe/1/edit?js,console

于 2013-07-25T14:18:45.400 に答える
0

あなたは試すことができますarr.map

var func = function  (arg, i) {
    var milliseconds = 1000;
    setTimeout(function(){
        console.log (arg);
    }, milliseconds*i);
}

var arr = new Array();
arr.push (0);
arr.push (1);

arr.map(func);

古いブラウザ用のデモポリフィル

更新:配列をループして各配列項目でコールバック関数を呼び出したいと思っていましたOPが、おそらく間違っていたので、回答を削除する代わりにここに保管しています。将来的に他の人に役立つかもしれません. これは現在の質問には答えません。

于 2013-07-25T14:13:34.410 に答える
0

ありがとう、@ヘルムズ。作業ソリューション:

var arrayFunc = function(array) {
  if (array.length > 0) {
    func(array[0], function() {arrayFunc(array.slice(1)); });
  }
  else
  {
    console.log("finish");
  }
}
arrayFunc(arr);
于 2013-07-25T14:52:11.327 に答える
-1

配列をループできます

for(var i = 0; i < arr.length; i++){
    func(arr[i], function(){...});
}
于 2013-07-25T13:59:34.427 に答える