Отмена обработки веб-сокета для нового запроса

Я использую модуль npm ws (или на самом деле называется оболочка isomorphic-ws) для веб-сокета. Я использую его для получения данных массива с сервера websocket++, работающего на том же ПК. Эти данные затем обрабатываются и отображаются в виде серии диаграмм. Теперь проблема в том, что сама обработка занимает очень много времени. Я использую одно сообщение для вычисления 16 графиков, и для каждого из них мне нужно вычислить много логарифмов и других медленных операций, и все это в JS. Ну, вся операция обновления занимает около 20 секунд. Теперь я на самом деле могу с этим смириться, но проблема в том, что когда я получаю новый запрос, он обрабатывается после завершения всего обработчика сообщений. И если я получу несколько запросов за это время, все они будут обработаны так, как они поступили. И поэтому запросы там ставятся в очередь, и текущее состояние становится все более и более устаревшим с течением времени... Я хотел бы иметь способ обнаружить, что есть другое сообщение, ожидающее обработки. Если это так, я мог бы просто остановить текущий обработчик в любое время и начать все сначала... Так что при использовании npm wsЕсть ли способ сообщить, что есть еще одно сообщение, ожидающее обработки?

Спасибо

0 ответов

Вам нужно создать своего рода отменяемый jobобертка. Трудно дать конкретное предложение, не видя своего кода. Но могло быть что-то вроде этого.

const processArray = array => {
  let canceled = false;

  const promise = new Promise((resolve, reject) => {
    // do something with the array
    for(let i = 0; i < array.length; i++) {
      // check on each iteration if the job has been canceled
      if(canceled) return reject({ reason: 'canceled' });
      doSomething(array[i])
    }
    resolve(result)
  })

  return {
    cancel: () => {
      cancel = true
    },
    promise
  }
}

const job = processArray([1, 2, 3, ...1000000]) // huge array

// handle the success
job.promise.then(result => console.log(result))

// Cancel the job
job.cancel()

Я уверен, что для этой цели существуют библиотеки. Но я просто хотел привести простой пример того, как это можно сделать.

Другие вопросы по тегам