我有一个 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));
相反,我总是得到未定义,但如果我改变了 return
声明中 createAccount
功能到。
return true;
它的工作和记录 true
.
我是新来的 async await
(这是我第一次用它做项目),网上的东西都没有用。到底是什么问题?
EDIT:这是服务器的代码(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
你只需要让它返回一个承诺。类似于:
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次,你有3个处理者在 'create account return'
.
活动还包括 async
这是最简单的使用方法,但你最好用一个类来封装它
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);