我有獲取調用此函數一次:從返回的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