Websocket事件监听器在执行其他功能时被锁定

时间:2019-05-06 13:56:04

标签: javascript node.js rest api websocket

我在最新版本的NodeJS中编写了一个API。 其目标是拥有一个RESTful接口,用户可以在其中发送代码 和代码可以使用的Websocket接口

唯一的问题是我无法与RESTful方法同时运行事件监听器client.on('data'

所以我愿意

global.writeRequest("#get_pos 1") // will request data from my Websocket Server and respond within 10ms~
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 4000); // wait 4 second to make sure the latency of the request doesn't affect the result
console.log("this is a test");

即使首先显示请求,该请求也会显示在最后。

此命令的结果:

this is a test // our console.log
POST /api/data 200 2.373ms -12 // end of the RESTful Method
Server says: %pos[1]:488 // result of our global.writeRequest from earlier except it's shown at the end

甚至更奇怪的是,事件侦听器似乎在整个RESTful方法期间被锁​​定,考虑到我想发送和使用来自事件侦听器的数据,这是一个问题。

甚至更奇怪的是,当我用这样的一种方法做多个global.writeRequest时:

global.writeRequest("#get_pos 1")
global.writeRequest("#get_pos 2")
global.writeRequest("#get_pos 3") // will request data from my Websocket Server and respond within 10ms~
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 4000); // wait 4 second to make sure the latency of the request doesn't affect the result
console.log("this is a test");

我最终得到以下

this is a test // our console.log
POST /api/data 200 2.373ms -12 // end of the RESTful Method
Server says: %pos[1]:488%pos[2]:488%pos[3]:488 

但是它应该显示以下内容,而不是console.log

Server says: %pos[1]:488
Server says: %pos[2]:488
Server says: %pos[3]:488 

因此,我推断执行我执行另一个函数时,事件监听器被锁定,因此我尝试将所有函数都放在async中,但是遇到了同样的问题。

代码:

client_websocket.js

const net = require('net');
const client = new net.Socket();
const port = 50000;
const host = '127.0.0.1';
const password = "something";

client.connect(port, host, async function () {
    console.log('Connected');
    client.write(password);
});

client.on('close', async function () {
    console.log('Connection closed');
});

writeRequest = async function (commmand) {
    client.write(commmand);
    return "Command sent!"
};
client.on('data', async function (data) {
    console.log("Server says: " + data);
}

requests_api.js

var Task = {
    sendData: async function (id) {
        console.log("code: " + id.code);
        return evalCode(id.code);
    }
};

async function evalCode(code) {
    global.getAllStats();
    return eval(code);
}

我的eval(code);然后可以使用websocket界面

在执行我的RESTful方法时,有什么想法可以解锁事件监听器吗?

1 个答案:

答案 0 :(得分:0)

看来Atomics.wait()正在阻止JS主线程,因此在该线程完成之前,无法处理该线程上的其他任何事件(包括任何套接字事件)。

您需要了解Javascript的事件模型,实际上不应该在主服务器线程上使用Atomics.wait(),因为它会阻塞所有其他事件的处理。

尚不确定您要使用Atomics.wait()解决什么问题,但是如果您只想在一段时间后运行一些代码,请使用setTimeout()并输入代码进入该回调。这样可以在等待计时器触发的同时处理事件。这是Javascript事件模型的重要方面。