Использование setInterval () для упрощенного непрерывного опроса

Для простого веб-приложения, которому необходимо обновлять части данных, представляемых пользователю через заданные интервалы, есть ли какие-либо недостатки в использовании простого использования setInterval () для получения JSON из конечной точки вместо использования правильная структура опроса?

Допустим, я обновляю статус задания обработки каждые 5 секунд.

34
задан Grokify 18 June 2018 в 06:33
поделиться

1 ответ

Просто измените ответ @bschlueter , и да, можно отменить эту функцию опроса путем вызова cancelCallback()

let cancelCallback = () => {};

var sleep = (period) => {
  return new Promise((resolve) => {
    cancelCallback = () => {
      console.log("Canceling...");
      // send cancel message...
      return resolve('Canceled');
    }
    setTimeout(() => {
      resolve("tick");
    }, period)
  })
}

var poll = (promiseFn, period, timeout) => promiseFn().then(() => {
  let asleep = async(period) => {
    let respond = await sleep(period);
    // if you need to do something as soon as sleep finished
    console.log("sleep just finished, do something...");
    return respond;
  }


  // just check if cancelCallback is empty function, 
  // if yes, set a time out to run cancelCallback()
  if (cancelCallback.toString() === "() => {}") {
    console.log("set timout to run cancelCallback()")
    setTimeout(() => {
      cancelCallback()
    }, timeout);
  }

  asleep(period).then((respond) => {
    // check if sleep canceled, if not, continue to poll
    if (respond !== 'Canceled') {
      poll(promiseFn, period);
    } else {
      console.log(respond);
    }
  })

  // do something1...
  console.log("do something1...");

})


poll(() => new Promise((resolve) => {
  console.log('Hello World!');
  resolve(); //you need resolve to jump into .then()
}), 3000, 10000);

// do something2...
console.log("do something2....")
0
ответ дан 27 November 2019 в 16:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: