Выполнять асинхронный код JavaScript каждые X секунд

1

Как выполнить асинхронный js-код (написанный в node.js) каждые X секунд и убедиться, что новый execute/call не будет запущен до того, как будет выполнен обратный вызов (успех, ошибка) из асинхронной функции. Пример кода:

asyncFunc(function(successData){
  // do something with successData
}, function(errorData){
  // do something with errorData
});

setInterval приходит мне на ум, но я думаю, что он не обеспечит того, что я хочу, если обратный вызов не выполняет внутри интервала, он перейдет в очередь.

EDIT: для упрощения дела повторите вызов функции aync через 1 секунду после завершения обратного вызова.

  • 1
    Вы хотите выполнять свой код каждые X секунд или X секунд после завершения предыдущего вызова?
  • 0
    и если предыдущий обратный вызов все еще выполняется, как долго вы хотите ждать перед началом следующего запуска? Сделайте это немедленно или дождитесь n * X секунд после предыдущего вызова или X секунд?
Показать ещё 1 комментарий
Теги:
asynchronous
repeat
function-calls

2 ответа

3

Вы можете использовать setTimeout следующим образом:

(function loop() {
    asyncFunc(function(successData){
        setTimeout(loop, X);
    }, function(errorData){
        // If you still want to continue:
        setTimeout(loop, X);
    });
})(); // execute immediately

Это запустит задержку, когда асинхронный вызов вызывает обратный вызов.

1

Рассмотрим абстрагирование проблемы с помощью метода повторного использования, который позволит вам указать функцию для вызова, интервал, на который он звонил, и обратные вызовы для вызова:

function repeatAsync(func, interval, success, error) {
    (function loop() {
        func(
            () => {
                success();
                setTimeout(loop, interval);
            },
            () => {
                error();
                setTimeout(loop, interval);
            }
        );
    })();   // invoke immediately
}

Если вы хотите, чтобы цепочка вызовов была нарушена при ошибке, замените второй аргумент func только с error, то есть func(() => {... }, error)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню