Socket.io 和异步不返回值

Socket.io and Async Not Returning Values

我有一个 async 客户端函数 returns 无论用户名是否被占用。我正在使用 socket.io 发送数据包,但我无法找出问题所在。

这是函数(浏览器):

let socket = io();
async function createAccount(username, password){
    socket.emit('create account', {username:username, password:password});

    let res;

    await socket.on('create account return', (data) => {
        res = data.failed;
    });
    return res;
};

这是我的测试脚本,如果用户名有效,它应该记录 true,否则 false

createAccount('bagel03', '12345').then((val)=>console.log(val));

相反,我总是得到 undefined,但是如果我将 createAccount 函数中的 return 语句更改为:

return true;

有效并记录 true

我是 async await 的新手(这是我的第一个项目),网上没有任何帮助。有什么问题?

编辑: 这是服务器代码 (Node.js):

const io = require('socket.io')(server,{ pingTimeout: 4000, pingInterval: 4000 })

io.sockets.on('connect',  socket =>{
    //account stuff
    socket.on('create account',  data =>{
        if(!isUsernameTaken(data.username)){
            id = addAccount(data);
            socket.emit('create account return',{failed:false})
        }else socket.emit('create account return', {failed:true})

    });
});

您不能在事件侦听器上使用 await。如果你想写你的 createAccount 以便用 await 调用你只需要将它变成 return 一个 Promise。类似于:

let socket = io();
function createAccount(username, password) {
  return new Promise((resolve, reject) => {
    socket.emit('create account', {username:username, password:password});

    socket.once('create account return', (data) => resolve(data.failed));
  });
};

我认为你没有以正确的方式使用 websocket 对象。
每次调用 createAccount 时,都会向 'create account return' 事件添加一个处理程序。例如,如果您调用 createAccount 3 次,那么您在 'create account return'.

上有 3 个处理程序

事件也是async,只要触发,就会调用事件处理程序。
这是您可以使用它的最简单方法,但最好将其包装在 class

let socket = io();
function createAccount(username, password){
    socket.emit('create account', {username:username, password:password});

};

function myHandler(data) {
   console.log(data.failed);
}

socket.on('create account return', myHandler);