2012-04-10 44 views
0

我正在查看使用ES5的新Array.forEach()。我相信每個項目的回調應該並行執行。我想要一個函數在所有值都處理完畢後返回。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 
     } 
    }) 
} 

我懷疑這可能是錯誤的做法:因爲每一個回調已經被解僱前parent_function可以完成。在這種情況下,發起自定義事件(這是由處理所有項目後生成的數據處理的)可能是最好的方法。不過,在MDC文檔中我沒有發現任何提及。

但我相當新的JS和愛一些同行評審來確認!

編輯:看起來像forEach()畢竟是同步的。之後我記錄了結果數組,並看到了不一致的結果 - 有時是兩個項目,有時是四個等,這使我認爲它是異步的。如果你正在閱讀本文並且有類似的行爲,我建議你閱讀這個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

赫赫謝謝。由於其他奇怪的行爲,我認爲我只是假設異步。 http://ecma262-5.com/ELS5_HTML.htm#Section_15.4.4.18提到了同步行爲。 – mikemaccana 2012-04-10 20:22:15

1

不,所有這些迭代器函數都是同步的。這意味着,回調是一個接一個地執行下一個項目,然後結尾forEach()返回(並返回未定義)。

如果你想要一個new_array與每個回調調用的結果,你可以看看map()

+0

謝謝 - 我發現http://stackoverflow.com/questions/5050265/javascript-nodejs-is-array-foreach-asynchronous其中有一個參考,它是同步確認你的答案。 map()是隻有**解決方案才能獲得new_array及其中所有已修改的項目? – mikemaccana 2012-04-10 20:09:25

+0

你會尋求什麼其他解決方案?當然,您可以在迭代時手動構建新的數組(優雅的解決方案使用[reduce](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/Reduce))。 – Bergi 2012-04-10 20:19:07