Отмена обработки веб-сокета для нового запроса
Я использую модуль 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()
Я уверен, что для этой цели существуют библиотеки. Но я просто хотел привести простой пример того, как это можно сделать.