Задать вопрос
partyzanx
@partyzanx

Как подождать асинхронную функцию внутри асинхронной фунции?

import translate from 'translate';  
...
export const search = async (req, res) => { 

...

const makeDictionaryTree = async elem => {
    let newArr = []
    for (let e of elem) { 
        let obj = new Object();
        obj.pinyin = e.pinyin;
        obj.definitions = e.definitions;
        for (let e of obj.definitions) {
            console.dir(e, ' = ')
            e = await translate(e, { to: 'ru', engine: 'google', key: process.env.TRANSLATE_KEY })
            console.dir(e)
        }
        newArr.push(obj)
    }
    return newArr
 }

...

    words = newArr.map(e => {
                            let newE = new Object();
                            newE.character = e; 
                            newE.decomp = decomp.lookup(e); 
                            newE.decomp2 = hanzi.decompose(e, 1);
                            newE.decomp3 = hanzi.decompose(e, 2);
                            newE.entries = makeDictionaryTree(getEntries(e));
                            return newE; 
                        })
 
...

    console.log(words)
    res.render("search", { pageTitle: "Search", searchingBy, newUrl, uniqueCharSet, words: words })
};


console.log(words[0].entries) Выводит Promise { }
Получается скрипт не дожидается функции makeDictionaryTree и сразу рендерит страницу

[
  {
    character: '觉',
    decomp: { label: '觉', children: [Array] },
    decomp2: { character: '觉', components: [Array] },
    decomp3: { character: '觉', components: [Array] },
    entries: Promise { <pending> }
  }
]
  • Вопрос задан
  • 184 просмотра
Подписаться 1 Средний Комментировать
Решения вопроса 1
Robur
@Robur
Знаю больше чем это необходимо
words = await Promise.all(newArr.map( async e => {
                            let newE = new Object(); 
                            newE.entries = await makeDictionaryTree(getEntries(e));
                            return newE; 
                        }))


ну или вместо newArr.map for сделайте, чтобы по очереди вызывались а не параллельно
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
div. Ставрополь
от 40 000 до 90 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽
18 дек. 2024, в 12:37
10000 руб./за проект
18 дек. 2024, в 12:22
5000 руб./за проект
18 дек. 2024, в 11:57
500 руб./в час