异步函数返回空值然后进行操作?

Async function returning empty value then doing operations?

嘿,我已经在 node js 中编写了这段代码

async function getUdemydata(){

    try{
        var finalData = []
        const res = await axios.get(baseUrl)
        const $ = cheerio.load(res.data);

        $('div[class="content"]').each(async (i,el) =>{
            const courseTitle = $(el).find("a").text()
            const aa = $(el).html() 
            const courseUrl = await getCoupenCode($(el).find("a").attr("href"))
            const courseDescription = $(el).find(".description").text().trim()
            const courseImage = await formateImageUrl($(el).find(".image").html())
            var dataObj = {
            "title": courseTitle,
            "description": courseDescription,
            "image": courseImage,
            "link": courseUrl
            }
            finalData.push(dataObj);
            console.log('appended');
        })
        return (finalData);
    } catch(error){
        console.error(error);
    }

}

(async()=>{
    var rs = await getUdemydata();
    console.log(rs);
})()

当我调用 getUdemydata() 函数时,仅打印空数组,然后打印函数内部的 appended 我应该在代码中更改什么该函数将 return 最终数组

.each的定义如下:

each<T>(fn: (i: number, el: T) => boolean | void): Cheerio<T>

它不是 Promise 感知的,因此 await 您作为其参数提供的异步函数也不是。

请记住,异步函数只是 returns 一个 Promise 的普通函数,因此您可以映射这些函数调用,以 Promise 的数组结束,然后等待对于他们所有人。

// var finalArray = [] // <-- NO
const promises = $('div[class="content"]')
    .toArray()
    .map(async (el,i) => {
        // same body as `each` in your code
        // except, don't push into `finalArray`
        // just return your value

        // finalData.push(dataObj); // <-- NO
        return dataObj;
    });
const finalArray = await Promise.all(promises);

或者如果 运行 一次所有这些承诺的并行性太多,那么文档建议使用 Cheerio is Iterable,所以只需使用普通 [= 遍历 $('div[class="content"]') 22=]

for(const el of $('div[class="content"]')) { //...