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);
我有一个 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'
.
事件也是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);