我有获取调用此函数一次:从返回的for循环它有一个异步调用
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的对象试图循环和比较一些领域一些给新数据。如果有一场比赛,我想用虚假的回报进行回叫。如果没有匹配,我想返回true。
我可以看到我的逻辑在下面是错误的,因为hgetall是异步的,因此两个返回都会被调用,所以如何在我找到匹配时立即停止执行并返回?
感谢
你的逻辑并不完全错误,你有一个回调的参数,所以当结果那里的代码将正常继续。但是,根本不需要返回,这不是触发执行后面必须执行的代码的事情。所有这些都必须在回调中完成,而不是在'validate'调用之后顺序放置。一个简单的解决方案是将'redis.hgetall'调用包装在一个函数中,该函数将附加参数'i'和'callback'作为var存储。像这样,'i'的值将是正确的 – Kaddath