Я запрограммировал API в последней версии NodeJS.
Его целью было создание интерфейса RESTful, куда пользователь мог бы отправлять код
и интерфейс Websocket, который код может использовать
Единственная проблема в том, что я не могу запустить прослушиватель событий client.on('data'
одновременно с моим методом RESTful.
Так что, если я сделаю
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);
}
my eval(code);
может использовать интерфейс websocket
Есть идеи разблокировать мой прослушиватель событий при выполнении моего метода RESTful?