从 socket.io 返回一个值到客户端

Big*_*oke 1 javascript node.js express socket.io

我正在尝试从服务器向客户端接收我正在制作的东西的当前抽屉的 ID。这就是我到目前为止所得到的

客户:

    socket.emit('returnDrawer');

    socket.on('returnDrawer', function(ret)
    {
        console.log("id:", ret);
    })
Run Code Online (Sandbox Code Playgroud)

服务器:

socket.on('returnDrawer', function() {
    return users[currentDrawer].ioid;
});
Run Code Online (Sandbox Code Playgroud)

但我的客户端回调根本没有被当前抽屉 ID 调用,需要一些帮助。

meg*_*768 8

您可以将回调函数作为参数发送给emit()。这是我的一个项目的例子。没有抽屉,但有动画。

客户端

socket.emit('animate', 'text', payload, (response) => {
    console.log(response);
});
Run Code Online (Sandbox Code Playgroud)

服务器端

socket.on('animate', (animation, payload, callback) => {

    callback = typeof callback == "function" ? callback : () => {};

    try {
        this.runAnimation(animation, payload);
        callback({status:'OK'});
    }
    catch(error) {
        callback({error:error.message});
    }

});
Run Code Online (Sandbox Code Playgroud)


Sup*_*acy 6

您可以使用不同的事件名称来发送和接收。这将帮助您在未来更好地扩展。

例如,上面的代码可以写成:-

// implementing client side
  socket.emit('returnDrawer');
  socket.on('returnDrawerResponse', function(message) {
    console.log('id', message)
  });
Run Code Online (Sandbox Code Playgroud)

对于服务器端,你可以这样写:

// implementing server side
  socket.on('returnDrawer', function(){ 
   // write Your awesome code here
   const userId = users[currentDrawer].ioid()
   socket.emit('returnDrawerResponse', userId)
 })
Run Code Online (Sandbox Code Playgroud)