2012-12-05 94 views
0

不止一次沒看到下面的減少功能MongoDB的映射縮減使用示例:Map/Reduce example ...這是正確的嗎?

function reduce(key, values) { 
    var result = {count:0}; 
    values.forEach(function(value) { 
     result.count += value.count; 
    }); 
    return result; 
} 

但是,這令我很奇怪。迭代使用.forEach()方法完成,該方法使用回調函數進行計數。但是,我們返回結果;馬上。

不能像的情況下,有時我們返回結果變量完成回調之前通過迭代值?

我認爲回調的目的是讓我們把它委託給一個(可能)不同的線程,而主控制流程繼續正常進行。

+1

回調可以在許多不同的方式使用。其中一些是異步的。許多人不是。 'forEach'不是異步的。但請注意,即使在處理異步行爲時,處理多個線程也相當罕見。在Javascript環境中有越來越多的可能性,但這種語言傳統上是單線程的。 –

+0

如果回調函數讓你感到困惑,請嘗試用'for'-loop簡單替換'forEach'。 – dfsq

+0

感謝您的意見!這並不是說它讓我感到困惑,因爲我沒有看到同步回調的重點。我認爲重點是具有更多功能的編程風格和閉包功能。 –

回答

3

forEach是不同步的。該forEach完成後
return語句只會被執行。

+0

感謝您的回答!似乎我錯過了Javascript書中的這一頁......雖然使用同步回調確實感覺有點沒有意義。也許這只是我。 –

+1

你還可以在'forEach'中執行代碼嗎?你需要回調來指定一個參數名稱(例如你的例子中的'value')。另外,這樣你可以在回調中通過名稱引用一個函數,並在不同的回調函數中重用該函數。 – Cerbrus

+0

重用部分很有意義,但對於我來說,如果在forEach完成後指定要執行的第二個回調的Promise類型的行爲會更有意義。實際上,返回依賴於在回調中修改的結果。實際上,我只想在forEach完成時嚴格返回,並且在純回調調用中,例如,如果CPU忙於其他任務,則不必馬上完成。 –