异步函数返回空值然后进行操作?
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"]')) { //...
嘿,我已经在 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"]')) { //...