gpt4 book ai didi

javascript - Socket.io 和 Async 不返回值

转载 作者:行者123 更新时间:2023-12-02 02:49:14 24 4
gpt4 key购买 nike

我有一个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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com