gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:01:44 26 4
gpt4 key购买 nike

我正在制作一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com