我一直在尝试使用nodejs从Wikipedia抓取一些数据。 我使用了request-promise和cheerio。 然后,requestPromise中的第一个块将按预期工作,并在完成上述整个代码逻辑后返回。 但是对于第二个然后阻塞的块,我使用了两种方法-M-1和M-2,但是尽管被阻塞,但两个代码都返回了数据,因此第三个然后阻塞了块的执行并且控制台日志未定义,我不明白为什么它在完成之前就返回了诺言
let cheerio = require('cheerio')
let requestPromise = require('request-promise')
//Website to be scraped
const url = "https://en.wikipedia.org/wiki/List_of_Presidents_of_the_United_States"
requestPromise(url)
.then( html => {
let wikiLinks = []
let obj = cheerio('big > a', html)
for (let key in obj){
if(obj[key].attribs){
wikiLinks.push(obj[key].attribs.href)
}
}
return wikiLinks
})
.then( links => {
//M-1
let data = []
let info
links.forEach(async link => {
info = await getAllBirthdayData(link)
data.push(info)
})
return data ==> returns []
//M-2
return Promise.all([
links.forEach(link => {
return getAllBirthdayData(link)
})
])
//M-3
return await Promise.all([
links.map( async link => {
return await getAllBirthdayData(link) ==> returns pending
promises only
})
])
})
.then(finalData => {
console.log(finalData)
})
.catch(err => {
console.log("error 1")
})
let getAllBirthdayData = (url) => {
return requestPromise("https://en.wikipedia.org/" + url)
.then( html => {
return {
name : cheerio('.firstHeading', html).text(),
birthday : cheerio('.bday', html).text()
}
})
.catch( err => {
console.log("error 2")
})
}
我希望输出是具有键值对的对象数组
[{name : something, birthday : 2018-01-01},
{name : something2, birthday : 2018-01-02}]