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

标签 node.js promise async-await

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

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

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()

我希望输出是这样的

[ 'Santa Tracker: Making a penguin-proof password','Google Duo: Stay in touch after the Holidays' ]

最佳答案

您需要为每个 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()
        })
    })
}

关于node.js - 无法使用 map() 和 async-await 将项目推送到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53963631/

相关文章:

javascript - 在类中使用 async await 来分配属性但返回 null

node.js - cron 作业会阻塞主进程还是 nodejs 会创建一个工作程序来执行 cron 任务

javascript - 如何返回以下 _.map + Promise 函数?

node.js - 如果可用,则快速重定向到静态 html,否则自定义路径

javascript - 当回调采用多个参数时如何 promise 一个函数

JavaScript/TypeScript - promise 循环不等待

javascript - 如何正确使用try/catch、promise catch和async函数?

javascript - Async Await 和 Promises - 如何改进语法

mysql - 序列化 findAll,其中列值与表中至少一项其他项目相同

node.js - 什么是应用程序启动文件以及使用 react 应用程序时应该加载什么?