javascript - Socket.io 和 Async 不返回值

标签 javascript node.js socket.io async-await es6-promise

我有一个async客户端函数,它返回用户名是否被使用。我正在使用 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));

相反,我总是未定义,但如果我将 createAccount 函数中的 return 语句更改为:

return true;

它可以工作并记录true

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

编辑: 这是服务器代码(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})

    });
});

最佳答案

我认为您没有以正确的方式使用 websocket 对象。
每次调用 createAccount 时,您都会向 'create account return' 事件添加一个处理程序。例如,如果您调用 createAccount 3 次,则您在“创建帐户返回” 上有 3 个处理程序。

事件也是异步,每当触发它们时,事件处理程序就会被调用。
这是使用它的最简单方法,但最好将其包装在类中

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

关于javascript - Socket.io 和 Async 不返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62314406/

相关文章:

node.js - Django channel 与 Node socket.io

javascript - 是否可以将 child 作为参数传递给 ko 计算函数

node.js - Webduino 从 curl 而不是从 Node 接收 POST 参数

javascript - 如何防止浏览器在提交表单时重定向到新页面?

node.js - Microsoft Bot Framework 中的 "custom prompts"是什么?

node.js - 如何保持/*!与 UglifyJS2 的评论?

node.js - 使用 socket.io 进行用户身份验证

node.js - socketio广播消息只发送给一个

javascript - 是否可以制作一个触发 PWA "Add to Home Screen"安装横幅的应用内按钮?

javascript - 当用户单击时,如何阻止我的文本在数组中循环?