Как убедиться, что интервальная функция вызывается снова, когда все асинхронные функции выполнены? - PullRequest
0 голосов
/ 05 июля 2018

Допустим, у меня есть эта функция:

var iv = setInterval(async() => {
  //timeconsuming calls
  await someFunction();
}, 8000);

Я хочу позвонить someFunction(), только если все асинхронные вызовы завершены. Внутри someFunction У меня есть такие звонки:

async someFunction(){
  await call1()
  await call2()
  await call3()
}

Как я могу этого достичь? Должен ли я использовать вместо setInterval функцию, которая возвращает boolean, если все функции завершены? Как мне этого добиться? я должен использовать функцию Promise.all() для ожидания всех асинхронных функций?

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Я бы сделал что-то вроде следующего -

function someFunction() {
    Promise.all([promiseCall1, promiseCall2, promiseCall3]).then(values => {
        if(!breakCondition)
            someFunction();
    });
}

Хотя не проверял.

0 голосов
/ 05 июля 2018

Один из вариантов - использовать функцию setTimeout, которая вызывает себя рекурсивно после завершения вызовов:

const call1 = () => new Promise(res => setTimeout(res, 200));
const call2 = () => new Promise(res => setTimeout(res, 200));
const call3 = () => new Promise(res => setTimeout(res, 200));
async function someFunction() {
  await call1();
  await call2();
  await call3();
}

const timeoutFn = async () => {
  console.log('iteration');
  await someFunction();
  setTimeout(timeoutFn, 8000);
  console.log('new timeout set');
};

timeoutFn();
...