提问者:小点点

当触发两个事件时,如何解决promise?


日安。这里是我有的一个函数:

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]}`);
    })
})
}

我想用这个功能实现的是,当客户机登录并且websession也登录时,只有此时才解决承诺。之所以如此,是因为时机很重要。


共2个答案

匿名用户

一个快速的解决方案是为每个事件维护2个布尔值,并且只有当两者都为真时(或者更准确地说,当另一个从事件处理程序中为真时)才调用

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();
    })
})
}

匿名用户

不是答案,只是语法。您可以使用析构来使您的代码更轻,更容易阅读。

   function LoginClient(user) {
      return new Promise((resolve, reject) => {
        const {
          client,
          
          details: {
            username,
            password,
            shared_secret,
          },
        } = SteamClients[user.username];
      
        client.logOn({
          accountName: username,
          twoFactorCode: SteamTotp.generateAuthCode(shared_secret),
          password, 
        });
        
        let isLoggedOn = false;
        let hasWebSession = false;
        
        client.on('loggedOn', () => {
          Debug.emit(
            'message',
            `Client logged in: ${SteamClients[user.username]}`,
          );
          
          isLoggedOn = true;
          
          if (hasWebSession) {
            resolve();
          }
        });
        
        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();
          }
        });
      });
    }