Socket.io和Async不返回值。

问题描述 投票:0回答:1

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

    });
});
javascript node.js socket.io async-await es6-promise
1个回答
1
投票

你不能使用 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));
  });
};

0
投票

我认为你没有正确地使用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);
© www.soinside.com 2019 - 2024. All rights reserved.