【发布时间】:2017-07-21 18:28:36
【问题描述】:
我有这个函数被调用一次:
exports.validate = function(roomData, callback) {
console.log('This only prints only once!');
getAllRooms(function(rooms) {
if (rooms.length === 0) {
callback(true);
return;
}
for (let i = 0; i < rooms.length; i++) {
let key = "roomAdmin:" + rooms[i].roomName;
redis.hgetall(key, function() {
let newUrl = roomData.url.toLowerCase();
let existingUrl = rooms[i].url.toLowerCase();
let newRoomName = roomData.roomName.toLowerCase();
let existingRoomName = rooms[i].roomName.toLowerCase();
if (newUrl === existingUrl || newRoomName === existingRoomName) {
console.log('This prints');
callback(false);
return;
}
if (i === rooms.length - 1) {
console.log('But this prints also?');
callback(true);
return;
}
})
}
});
};
我正在尝试遍历一组 redis 对象并将一些字段与一些给出的新数据进行比较。如果有匹配,我想用 false 回调并返回。如果没有匹配,我想返回 true。
我可以在下面看到我的逻辑是错误的,因为 hgetall 是异步的,所以两个返回都被调用,那么我如何停止执行并在找到匹配项后立即返回?
谢谢
【问题讨论】:
-
您的逻辑并没有完全错误,您有一个回调作为参数,因此当结果存在时代码将正确运行。但是,根本不需要返回,这不会触发必须执行的代码的执行。之后要做的所有事情都必须在回调中,而不是在
validate调用之后依次放置。一个简单的解决方案是将redis.hgetall调用包装在一个函数中,该函数将作为附加参数i和callback存储为一个var。这样i的值就对了
标签: javascript node.js