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