javascript - 当两个事件同时触发时如何解决promise?

标签 javascript node.js events

美好的一天。这是我的一个功能:

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/

相关文章:

Node.js - 记录/使用 morgan 和 winston

javascript - 如何为动态插入的 'input' 文本元素正确捕获 onchange 或 onkeyup 事件?

reactjs - React Typescript 中的类型 'elements' 上不存在属性 'EventTarget'

javascript - amChart 图异常(exception)观

javascript - 从 localStorage 获取值以在 popup.html 中使用

node.js - 网络服务器如何处理同一端口上的多个连接

javascript - 如何用箭头键移动一个div

javascript - angularjs 将变量传递给 Controller

javascript - 通过nuget安装angular js和angular js core有什么区别?

javascript - NPM:将多个模块和自定义脚本与 browserify 相结合