我在下面提到的函数中使用了两个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"});
    });
}

最佳答案

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

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

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

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

09-11 19:20
查看更多