Слушатель событий Websocket заблокирован при выполнении другой функции - PullRequest
0 голосов
/ 06 мая 2019

Я запрограммировал 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?

1 Ответ

0 голосов
/ 07 мая 2019

Похоже, что Atomics.wait() блокирует основной поток JS, поэтому никакие другие события в этом потоке (включая любые события сокетов) не могут быть обработаны, пока это не будет сделано.

Вы должны понимать модель событий Javascript и на самом деле никогда не должны использовать Atomics.wait() в основном потоке сервера, поскольку он блокирует обработку всех других событий.

Не совсем понятно, какую проблему вы пытаетесь решить с помощью Atomics.wait(), но если вы просто хотите запустить какой-то код через некоторое время, используйте setTimeout() и поместите код в этот обратный вызов , Это позволит обрабатывать события в ожидании срабатывания таймера. Это важный аспект модели событий Javascript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...