2012-12-05 59 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忙于其他任务,则不必马上完成。 –