美好的一天。这是我的一个功能:
function LoginClient(user) {
return new Promise((resolve, reject) => {
SteamClients[user.username].client.logOn({
accountName: SteamClients[user.username].details.username,
password: SteamClients[user.username].details.password,
twoFactorCode: SteamTotp.generateAuthCode(SteamClients[user.username].details.shared_secret)
})
SteamClients[user.username].client.on('loggedOn', ()=> {
Debug.emit('message', `Client logged in: ${SteamClients[user.username]}`);
})
SteamClients[user.username].client.on('webSession', (sid, cookies)=> {
manager.setCookies(cookies);
community.setCookies(cookies);
Debug.emit('message', `Client logged into websession: ${SteamClients[user.username]}`);
})
})
}
我想通过这个功能实现的是,当客户端登录并且网络 session 登录时,只有这样,promise 才会得到解决。原因是因为时机很重要。
最佳答案
一个快速的解决方案是为每个发生的事件维护 2 个 bool 值,并且仅在两者都为 true 时才调用 resolve
(或者,更准确地说,当 other 中的 other 为 true 时事件处理程序)
function LoginClient(user) {
return new Promise((resolve, reject) => {
SteamClients[user.username].client.logOn({
accountName: SteamClients[user.username].details.username,
password: SteamClients[user.username].details.password,
twoFactorCode: SteamTotp.generateAuthCode(SteamClients[user.username].details.shared_secret)
})
var isLoggedOn = false;
var hasWebSession = false;
SteamClients[user.username].client.on('loggedOn', ()=> {
Debug.emit('message', `Client logged in: ${SteamClients[user.username]}`);
isLoggedOn = true;
if(hasWebSession) resolve();
})
SteamClients[user.username].client.on('webSession', (sid, cookies)=> {
manager.setCookies(cookies);
community.setCookies(cookies);
Debug.emit('message', `Client logged into websession: ${SteamClients[user.username]}`);
hasWebSession = true;
if(isLoggedOn) resolve();
})
})
}
关于javascript - 当两个事件同时触发时如何解决promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65598158/