0

ES5の新しいArray.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
        }
    })
}

これは間違ったアプローチである可能性があります。すべてのコールバックが発生する前にparent_functionが終了する可能性があるためです。この場合、カスタムイベント(すべてのアイテムを処理した後に生成されたデータを必要とするものによって処理される)を発生させることが最善のアプローチである可能性があります。ただし、MDCドキュメントでそのことについての言及は見つかりませんでした。

しかし、私はJSにかなり慣れていないので、確認のためにピアレビューをしたいと思います。

編集:forEach()は結局同期しているように見えます。その後、結果の配列をログに記録し、一貫性のない結果を確認しました。2つの項目、場合によっては4つの項目など、非同期であると思わせました。これを読んでいて同様の動作をしている場合は、Chromeの配列ロギングの問題についてこの項目を読むことをお勧めします。

4

2 に答える 2

1

いいえ、これらのイテレータ関数はすべて同期しています。つまり、コールバックは次のアイテムで次々に実行され、最後forEach()に戻ります(そして未定義を返します)。

new_array各コールバック呼び出しの結果を使用したい場合は、を参照してくださいmap()

于 2012-04-10T20:01:36.007 に答える
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;
}
于 2012-04-10T20:14:05.960 に答える