为什么这段代码不会破坏嵌套的forEach

时间:2017-09-22 21:24:14

标签: javascript node.js loops

我在下面提到的函数中使用了两个return语句。但仍然为所有用户提供功能循环。

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"});
    });
}

2 个答案:

答案 0 :(得分:3)

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);

答案 1 :(得分:0)

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