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> }
  }
]
  • Вопрос задан
  • 132 просмотра
Решения вопроса 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 сделайте, чтобы по очереди вызывались а не параллельно
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
locky_yotun
@locky_yotun Куратор тега JavaScript
Я видел некоторый джаваскрипт
(async () => {
    const getAsync = async num => new Promise(resolve => resolve(num * 2));
    const arr = [0,1,2,3];
    const result = await Promise.all(arr.map(num => getAsync(num)));
    console.log(result);
})();
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы