我在最新版本的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方法时,有什么想法可以解锁事件监听器吗?
答案 0 :(得分:0)
看来Atomics.wait()
正在阻止JS主线程,因此在该线程完成之前,无法处理该线程上的其他任何事件(包括任何套接字事件)。
您需要了解Javascript的事件模型,实际上不应该在主服务器线程上使用Atomics.wait()
,因为它会阻塞所有其他事件的处理。
尚不确定您要使用Atomics.wait()
解决什么问题,但是如果您只想在一段时间后运行一些代码,请使用setTimeout()
并输入代码进入该回调。这样可以在等待计时器触发的同时处理事件。这是Javascript事件模型的重要方面。