я в настоящее время есть функция, которая выглядит следующим образом:Подход, чтобы проверить, был ли последний обратный вызов?
function update() {
buildUpdate(function(result) {
// send result to clients
});
}
Это нормально работает правильно. Однако, если я что-то типа:
// data state 1
update(); // this time, buildUpdate() won't take a long time
// do some work resulting in:
// data state 2
update(); // this time, buildUpdate() will take a long time
// and thus will finish after the third call
// do some work resulting in:
// data state 3
update(); // this time, buildUpdate() won't take a long time
Как и ожидалось, клиенты получат три обновления. Однако они находятся в неправильном порядке, потому что третий вызов update()
закончил раньше второго. С точки клиентов зрения это выглядит следующим образом:
- получает обновление, рассчитанное на основе состояния данных 1
- Получает обновление рассчитывается на основе состояния данных 3
- Получает обновление рассчитывается на основе состояния данных 2 (это обновление не следует отправлять)
Есть ли какой-либо шаблон дизайна или функция, которая помогает избежать такого случая?
Примечание: Не имеет значения, не получает ли клиент все обновления. Важно только то, что полученный последний должен соответствовать текущему состоянию данных.
Моя идея состояла в том, чтобы генерировать при каждом вызове update()
случайный идентификатор. После этого я проверяю обратный вызов, соответствует ли его идентификатор последнему, который был сгенерирован. Однако генерация самого идентификатора вводит новый асинхронный расчет и приводит к значительному количеству кода для каждого использования.
A: Независимо от вашей платформы быть node.js этот вопрос не имеет ничего общего с Node.js B : Что вы хотите, чтобы обновление было вызвано во второй раз?Учитывая ответ на вопрос B, я думаю, что я могу помочь вам с лучшей идеей, чем ваш случайный идентификатор. –
@GeorgeJempty A: Вы правы, я прошу прощения за неправильную маркировку. B: См. Пересмотренный вопрос. – ted