无法使用map()和async-await将项目推送到数组

时间:2018-12-28 19:48:12

标签: node.js promise async-await

我正在制作一个不和谐的机器人来播放youtube视频。我正在使用此Google API从ID中获取视频标题,但是get_title()函数返回了一个空的jsons数组。

我尝试在jsons函数之后和request()函数之后立即记录map()数组,但是它们都返回空数组。如果我console.log(jsons)之后jsons.push(json),它确实返回带有标题的数组。

const browser = require('https')
var urls = ['https://www.googleapis.com/youtube/v3/videos?key=AIzaSyC7udvST-lyLpx_gxHBc22kGYhEUOeQz5k&part=snippet&id=QKm4q6kZK7E', 'https://www.googleapis.com/youtube/v3/videos?key=AIzaSyC7udvST-lyLpx_gxHBc22kGYhEUOeQz5k&part=snippet&id=ib3fDx75Esw']

function get_title() {
    return new Promise(function(resolve, reject) {
        var jsons = []
        urls.map(url => {
            browser.request(url, res => {
                let body = ''
                res.on('data', data => {
                    body += data
                })
                res.on('end', () => {
                    var json = JSON.parse(body).items[0].snippet.title
                    jsons.push(json)
                })
            }).end()
        })
        resolve(jsons)

    })
}
async function main() {
    res = await get_title()
    console.log(res)
}
main()

我希望输出像这样

  

['圣诞老人追踪器:输入防企鹅密码','Google Duo:假期后保持联系']

2 个答案:

答案 0 :(得分:3)

对于每个URL请求,您需要一个单独的Promise,然后使用Promise.all,它将等待所有请求并将响应收集到一个数组中:

function get_title() {
    return Promise.all(urls.map(url => {
        return new Promise(function(resolve, reject) {
            browser.request(url, res => {
                let body = ''
                res.on('data', data => {
                    body += data
                })
                res.on('end', () => {
                    var json = JSON.parse(body).items[0].snippet.title
                    resolve(json)
                })
            }).end()
        })
    })
}

答案 1 :(得分:1)

由于spy接受数组,因此有助于消耗已设置的地图。这样,您也不必跟踪数组:

Promise.all()