我正在制作一个不和谐的机器人来播放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:假期后保持联系']
答案 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()