alexbuki
@alexbuki
программист js

Как сделать асинхронным вызов setTimeout и рекурсии?

Коллеги, просьба помочь.
Есть несколько запросов на сервер. В замен сервер создает задачи по эти запросам и отдает id задачи, по которому я проверяю статус выполнения задачи другим запросом.
Когда все задачи выполнены, необходимо продолжить выполнение синхронного кода.
Как дождаться выполнения всех задач?

Вот как это устроено у меня:
async getTaskStatus(id, resolve) {
            if (!this.queryCounter) {
                this.queryCounter = 0;
            }
            if (this.queryCounter > 20) {
                return this.errHandler();
            }
            try {
                const { data: { data: { status } } } = await checkTaskStatus(id);
                if (status === 'done') {
                    return resolve();
                } if (status === 'error') {
                    this.$message.error('Ошибка проведения операции, попробуйте позже');
                    this.$router.push('/users');
                } else {
                    setTimeout( () => {
                        this.queryCounter++;
                        this.getTaskStatus(id, resolve);
                    }, 500);
                }
            } catch (e) {
                console.error(e);
            }
        };

       try {
                        const { id } = this.ruleForm.user_dto;
                        const tasks = [];
                        tasks.push(updateUserData(id));
                        tasks.push(updateATTRData(id));
                       tasks.push(updateOldATTRData(id));

                        const results = await Promise.all(tasks);
                        for (let i = 0; i < results.length; i++) {
                            if (results[i].data.validation_result.success === true) {
                                let resolve = () => Promise.resolve();
                                await this.getTaskStatus(results[i].data.data, resolve);
                            } else {
                                this.errHandler();
                            }
                        }
                        this.setUser(this.userId);
                        this.editAdmin = false;
                    } catch (e) {
                        this.errHandler();
                        console.error(e);
                    }


Соответственно идут первые запросы в цикле и продолжается выполнение кода.
В функции получении статуса есть рекурсия через SetTimeout, тут по сути код и перестает быть асинхронным.
Как дождаться получения статусов с выполненными задачами?
  • Вопрос задан
  • 194 просмотра
Решения вопроса 1
megafax
@megafax
web-программист
Оберните все в анонимный async, а дальше два Promise.all. Суть в то, что Вам придется "внести" Ваш синхронный код в асинхронный "then" через await или Promise - не важно.
Примерно вот так должна быть конструкция
(async () => {
let reqs = [];

async function doTasks() {
return Promise.all( reqs.map((req) => doReq(req)) )
  .then((tasks) => Promise.all( tasks.map((task) => checkStatus(task)) ))
  .catch(console.error);
};

await doTasks();

// do some sync code
})();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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