Javascript 等待forEach循环完成?
直接在forEach循环之后添加回调不起作用。我是node.js的新手,因此非常感谢您的帮助,谢谢 这是用于记录玩家登录和注销时间的Minecraft机器人。在我被踢出服务器后,我想在尝试重新加入之前结束所有玩家的会话,但在下面的代码中,即使我使用Javascript 等待forEach循环完成?,javascript,node.js,async.js,Javascript,Node.js,Async.js,直接在forEach循环之后添加回调不起作用。我是node.js的新手,因此非常感谢您的帮助,谢谢 这是用于记录玩家登录和注销时间的Minecraft机器人。在我被踢出服务器后,我想在尝试重新加入之前结束所有玩家的会话,但在下面的代码中,即使我使用async.series它仍然不会等到第一个函数完成-这是因为我回调的位置吗 bot.on('kicked', function(reason) { console.log("I got kicked for", reason, "lol");
async.series
它仍然不会等到第一个函数完成-这是因为我回调的位置吗
bot.on('kicked', function(reason) {
console.log("I got kicked for", reason, "lol");
var timestamp = getTimestamp();
async.series([
function(callback) {
console.log("logging out all players");
logoutAllPlayers(timestamp, function(finished) {
console.log("logged out all players " + finished);
if (finished) {
callback();
}
});
},
function(callback) { //don't execute until previous function has run completely
//rejoin here
bot = mineflayer.createBot(options);
bindlisteners(bot);
}
]);
});
function logoutAllPlayers(timestamp, callback) {
findOnlinePlayers(function(onlinePlayers) {
if (onlinePlayers.length > 0) {
onlinePlayers.forEach(function(player) {
var playerId = player.id;
var username = player.username;
async.waterfall([
function(callback) { //add logout event
addEvent(playerId, 2, timestamp, function(logoutEventId) {
console.log("[" + timestamp + "] " + "Created logout: " + logoutEventId + " for " + username + " (" + playerId +")");
callback(null, logoutEventId);
});
},
function(logoutEventId, callback) { //find players current session
findSession(playerId, function(sessionId, loginEventId) {
console.log("[" + timestamp + "] " + "Found session: " + sessionId +" for " + username + " (" + playerId +")");
callback(null, sessionId, loginEventId, logoutEventId);
});
},
function(sessionId, loginEventId, logoutEventId, callback) { //get timestamps for login and logout events to find the duration of session
findEventTimestamp(loginEventId, function(loginTimestamp) {
findEventTimestamp(logoutEventId, function(logoutTimestamp) {
var difference = diffBetweenTimestamps(loginTimestamp, logoutTimestamp);
console.log("[" + timestamp + "] " + "Duration: " + difference + " for " + username);
callback(null, sessionId, logoutEventId, difference, callback);
});
});
},
function(sessionId, logoutEventId, difference, callback) { //end session and update online status
endSession(sessionId, logoutEventId, difference, function(callback) {
console.log("[" + timestamp + "] " + "Updated session: " + sessionId + " for " + username + " (" + playerId +")");
updatenOnlineStatus(playerId, false);
});
}
]);
});
callback(true);
}
});
}
回拨的正确位置在哪里
bot.on('kicked', function(reason) {
console.log("I got kicked for", reason, "lol");
var timestamp = getTimestamp();
async.series([
function(callback) {
console.log("logging out all players");
logoutAllPlayers(timestamp, function(finished) {
console.log("logged out all players " + finished);
if (finished) {
callback();
}
});
},
function(callback) { //don't execute until previous function has run completely
//rejoin here
bot = mineflayer.createBot(options);
bindlisteners(bot);
}
]);
});
function logoutAllPlayers(timestamp, callback) {
findOnlinePlayers(function(onlinePlayers) {
if (onlinePlayers.length > 0) {
onlinePlayers.forEach(function(player) {
var playerId = player.id;
var username = player.username;
async.waterfall([
function(callback) { //add logout event
addEvent(playerId, 2, timestamp, function(logoutEventId) {
console.log("[" + timestamp + "] " + "Created logout: " + logoutEventId + " for " + username + " (" + playerId +")");
callback(null, logoutEventId);
});
},
function(logoutEventId, callback) { //find players current session
findSession(playerId, function(sessionId, loginEventId) {
console.log("[" + timestamp + "] " + "Found session: " + sessionId +" for " + username + " (" + playerId +")");
callback(null, sessionId, loginEventId, logoutEventId);
});
},
function(sessionId, loginEventId, logoutEventId, callback) { //get timestamps for login and logout events to find the duration of session
findEventTimestamp(loginEventId, function(loginTimestamp) {
findEventTimestamp(logoutEventId, function(logoutTimestamp) {
var difference = diffBetweenTimestamps(loginTimestamp, logoutTimestamp);
console.log("[" + timestamp + "] " + "Duration: " + difference + " for " + username);
callback(null, sessionId, logoutEventId, difference, callback);
});
});
},
function(sessionId, logoutEventId, difference, callback) { //end session and update online status
endSession(sessionId, logoutEventId, difference, function(callback) {
console.log("[" + timestamp + "] " + "Updated session: " + sessionId + " for " + username + " (" + playerId +")");
updatenOnlineStatus(playerId, false);
});
}
]);
});
callback(true);
}
});
}
在
logoutAllPlayers
中,您正在调用callback(true)在您的async.faildown
调用完成其步骤之前
相反,您应该从//结束会话并更新联机状态中调用最终瀑布回调
,然后将瀑布的最后一行更改为具有完成回调
async.waterfall([
// ...
], function(){
callback(true);
});
我建议在该函数中添加一个错误捕捉,。],函数(err){callback(!!err);}
,除非您有更好的“false”捕捉。