Как выполнить асинхронный js-код (написанный в node.js) каждые X секунд и убедиться, что новый execute/call не будет запущен до того, как будет выполнен обратный вызов (успех, ошибка) из асинхронной функции. Пример кода:
asyncFunc(function(successData){
// do something with successData
}, function(errorData){
// do something with errorData
});
setInterval приходит мне на ум, но я думаю, что он не обеспечит того, что я хочу, если обратный вызов не выполняет внутри интервала, он перейдет в очередь.
EDIT: для упрощения дела повторите вызов функции aync через 1 секунду после завершения обратного вызова.
Вы можете использовать setTimeout
следующим образом:
(function loop() {
asyncFunc(function(successData){
setTimeout(loop, X);
}, function(errorData){
// If you still want to continue:
setTimeout(loop, X);
});
})(); // execute immediately
Это запустит задержку, когда асинхронный вызов вызывает обратный вызов.
Рассмотрим абстрагирование проблемы с помощью метода повторного использования, который позволит вам указать функцию для вызова, интервал, на который он звонил, и обратные вызовы для вызова:
function repeatAsync(func, interval, success, error) {
(function loop() {
func(
() => {
success();
setTimeout(loop, interval);
},
() => {
error();
setTimeout(loop, interval);
}
);
})(); // invoke immediately
}
Если вы хотите, чтобы цепочка вызовов была нарушена при ошибке, замените второй аргумент func
только с error
, то есть func(() => {... }, error)