函数在完成诺言/等待之前返回(阻塞代码)

时间:2019-07-04 21:12:23

标签: javascript node.js async-await es6-promise

我一直在尝试使用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}]

0 个答案:

没有答案