Переменная внутри обратного вызова веб-сокета не обновляется - PullRequest
0 голосов
/ 02 марта 2020

Я пишу промежуточное ПО Koa, которое при каждом запросе к серверу анализирует некоторые входные данные из файла на сервере и отправляет их через веб-сокет (используя https://www.npmjs.com/package/ws) клиенту.

Это все работает как положено, за исключением одной проблемы. Данные (в результате анализа входных данных из файла) обновляются должным образом, но не обновляются в области обратного вызова websocket.

const websocket = new WebSocket.Server({ port: 8082 });

const sourceAST = parseJS();
const conditionResults = getConditionResults(sourceAST);

console.log('handling request', conditionResults); // <-- updates as expected every time

websocket.on('connection', ws => {
  console.log(conditionResults); // <-- not updated :(
  ws.send(
    JSON.stringify({
      type: 'feedback-updated',
      feedback: conditionResults,
    }),
  );
});

Я не могу понять, почему условие в результатах внутри Обратные вызовы ws замораживаются при первом запуске, поэтому не обновляются при каждом запуске этого кода (при каждом запросе).

Редактировать: для контекста приведенный выше фрагмент кода находится внутри функции промежуточного программного обеспечения как это:

myMiddleware = async (ctx, next) => {
  await next();
  // my code snippet above
}

И промежуточное программное обеспечение запускается на Коа так:

app.use(myMiddleware);

1 Ответ

0 голосов
/ 02 марта 2020

Если ваша функция промежуточного программного обеспечения может быть инициирована другим процессом, , а также сообщением веб-сокета, что-то вроде этого должно работать:

const websocket = new WebSocket.Server({port: 8082});

let sourceAST;
let conditionResults;

// Triggered by websocket message
websocket.on('message', data => {
    doThings()
});

// Triggered by your middleware
myMiddleware = async (ctx, next) => {
    await next();

    doThings()
};

function doThings () {
    sourceAST = getConditionResults(sourceAST);
    conditionResults = getConditionResults(sourceAST);
    console.log(conditionResults);

    websocket.send(
        JSON.stringify({
            type: 'feedback-updated',
            feedback: conditionResults,
        }),
    );
}
...