2012-04-10 6 views
0

私はES5の新しいArray.forEach()を使っています。私は各項目のコールバックが並行して実行されるべきだと考えています。私はすべての値が処理された後に関数を返すようにしたいと思います。すべてのコールバックが発射される前にparent_functionが終了してもよいので:ES5:forEachですべてのアイテムがコールバックされたら親関数を返す

// I'd like to make parent_function return a new array with the changed items. 
function parent_function(array_of_things) { 
    new_array = [] 
    array_of_things.forEach(function(thing) { 
     new_array.push('New '+thing) 
     if (new_array.length === array_of_things.length) { 
      // OK we've processed all the items. How do I make parent_function return the completed new_array? 
      return new_array 
     } 
    }) 
} 

は、私は、これは間違ったアプローチであってもよいと思われます。この場合、カスタムイベント(すべてのアイテムを処理した後にデータを生成する必要があるもの)が発生するが最適なアプローチです。しかし、私はMDCのドキュメントでそのことについて言及していませんでした。

しかし、私はかなりJSに新しいですし、確認するためにいくつかのピアレビューが大好きです!

編集:forEach()は結局同期しているように見えます。私は後で結果の配列を記録していて、矛盾した結果を見ていました。時には2つの項目、時には4つの項目などがありました。これを読んで、同様の動作をしている場合は、このitem about issues in Chrome's array loggingを読むことをお勧めします。

答えて

1

のforEach()の呼び出しは同期的である、あなただけのforEach()が終了した新しい配列を返すことができます。

function parent_function(array_of_things) { 
    var new_array = []; 
    array_of_things.forEach(function(thing) { 
    new_array.push('New '+thing); 
    }); 
    return new_array; 
} 
+0

Heheありがとう。私はちょうど他の奇妙な行動のために非同期を仮定したと思う。 http://ecma262-5.com/ELS5_HTML.htm#Section_15.4.4.18には、同期の動作が記述されています。 – mikemaccana

1

いいえ、すべてのこれらの反復子関数は同期しています。つまり、コールバックは次々に実行され、最後にforEach()が返ります(そして、未定義を返します)。

new_arrayに各コールバック呼び出しの結果が表示されるようにするには、map()をご覧ください。

+0

感謝を - 私が見つけたhttp://stackoverflow.com/questions/5050265/javascript-nodejs-is-array-foreach-asynchronousには、あなたの答えを確認するための同期をとるための参照があります。 map()は、変更されたアイテムをすべて含むnew_arrayを得るための** only **ソリューションですか? – mikemaccana

+0

その他の解決策はありますか?もちろん、反復処理(エレガントなソリューションは[reduce](https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Array/Reduce)を使用しています)では、常に手動で新しい配列を構築できます。 – Bergi

関連する問題