@OlegBagirov

Как получить значение после выполнения асинхронной функции?

Не могу получить значение массива после его заполнения в асинхронной функции.
public massiv: object[]
...
public async doMassiv(x: number) {                
        const element = await doRequest(х)
        if (element.dataList.length != 0) {
                element.dataList.forEach( (item) => {
                    this.massiv.push(item.name)
                    this.doMassiv(item.name)
                })
        }
        console.log(this.massiv.length) 
       //в консоль успешно выводится длинна массива на каждой итерации
    }
...
public showMassiv() {
    doMassiv(someValue)
    console.log(this.massiv.length)  
   //в консоль выводится 0, а ожидаю что выведется результат работы функции по всему массиву  
}


Если я делаю асинхронной вторую функцию - то результат выводится только по первому проходу массива

public async showMassiv() {
    await doMassiv(400)
    console.log(this.massiv.length)  
   //в консоль выводится длинна массива после первого прохода doMassiv
}
  • Вопрос задан
  • 234 просмотра
Решения вопроса 1
Athanor
@Athanor
Лайк + Решение: не жмись, нажми
Что-то странное творится либо в нейминге, либо в логике. Зачем вам там рекурсия? Почему item.name имеет тип Number?

Так или иначе, лучше вам будет не мутировать в асинхронных функциях какое-либо глобальное свойство. Объявляйте массив прямо там и там же работайте с ним, если его нужно прокинуть внутрь очередного вызова функции, передавайте его как аргумент.
А затем сделайте так, чтоб функция doMassiv вернула этот массив.
Далее уже в showMassiv принимайте этот массив и сохраняйте глобально, раз это вам нужно.

А еще хочу заметить, что вы забыли добавить await перед рекурсивным вызовом this.doMassiv(item.name), вероятно поэтому происходит вот это:
public async showMassiv() {
    await doMassiv(400)
    console.log(this.massiv.length)  
   //здесь в консоль выводится длинна массива после первого прохода doMassiv
}


UPDATE
Как справедливо заметил Алексей в комментах, await и не будет работать внутри forEach, вот по этим причинам. Следовательно, стоит заменить его на обычный цикл for, или написать asyncForEach, как в статье
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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