首页 > 解决方案 > 如何使socket.io异步方法同步?

问题描述

我在这里关注代码片段https://github.com/socketio/socket.io-redis#redisadapterclientsroomsarray-fnfunction

io.in('room3').clients((err, clients) => {
  console.log(clients); // an array containing socket ids in 'room3'
});

让客户进入特定的房间。

有没有一种简单/惯用的方法可以使这个片段同步?我想遍历一组房间并同步获取clients.length每个房间中的用户数(即在检索到当前房间的用户数之前不要遍历循环。)

标签: javascriptsocket.io

解决方案


您可以在循环内使用Promisesasync awaitfor

 async function getClients() {
    for(let room in rooms) {
      try{
       const promise = new Promise((res, rej) => {
           io.in(room).clients((err, clients) => {
              if(err) {
                 rej(err);
              } else {
                  res(clients); // an array containing socket ids in room
              }
           });
       })
       const clients = await promise;
       console.log(clients);
      }catch(err) {
        console.log(err)
      }
   };
}

使用上述方式将帮助您遍历每个房间并逐个获取客户端。

虽然你不能强制它们同步运行


推荐阅读