为什么这段代码不会中断嵌套forEach

我已经在下面提到的函数中使用了两个返回语句。 但仍然为所有用户循环。

module.exports.getByKey = function(key, callback) { User.find().populate('licences').exec(function(err, users) { if(err) { return callback(err); } var keyFound = false; users.forEach(function(user) { console.log("user found " + user.name); user.licences.forEach(function(licence) { console.log("licence found"); if(licence.key == key) { keyFound = true; callback(null, user); return; } }, this); if(keyFound) { console.log("+++++++++++++++++++++++"); return; } }, this); // return callback({error: "Invalid Key"}); }); } 

Array#forEach迭代数组的所有元素,它不尊重任何返回值。

要使用短路,可以使用Array#some并返回true来停止迭代或Array#every ,在这里您需要返回一个truthy值以继续循环。

通过使用嵌套的方法,您需要将返回值冒泡到外部数组循环。

 var keyFound = users.some(function(user) { // return some return user.licences.some(function(licence) { // return some if (licence.key == key) { callback(null, user); return true; } }, this); }, this); 

因为返回内部匿名函数; 下面的用户再次调用相同的函数(外部foreach)