gpt4 book ai didi

node.js - Node JS 出现问题并 promise 在完成前返回

转载 作者:太空宇宙 更新时间:2023-11-03 23:49:08 24 4
gpt4 key购买 nike

我尝试获取 Youtube 的特定 channel ID 的最后上传的视频列表并进行统计。我得到了列表,但没有统计数据。

我认为结果是在对象分配之前返回的。对象赋值后如何返回结果?

这是我的代码:

async function (inputs, exits) {

var { google } = require('googleapis');
var youtubeApiKey = 'API_KEY';
var service = google.youtube('v3');

// Get upload ID to list uploaded videos
service.channels.list({
part: 'contentDetails',
id: inputs.ytbIdChannel,
key: youtubeApiKey,
})
.then(res => {
if (res.data.items[0].contentDetails.relatedPlaylists.uploads) {
let uploadsId = res.data.items[0].contentDetails.relatedPlaylists.uploads;

// With the uploadID, get all uploaded videos
service.playlistItems.list({
part: 'snippet',
playlistId: uploadsId,
maxResults: '12',
key: youtubeApiKey,
})
.then(res => {
this.youtbeVideos = res.data.items,

// For each videos in list, inject the statistics object and return all videos
this.youtbeVideos.forEach(video => {
let videoId = video.snippet.resourceId.videoId

service.videos.list({
part: 'statistics',
id: videoId,
key: youtubeApiKey,
})
.then(res => {
Object.assign(video, res.data.items[0].statistics)
return exits.success(
this.youtbeVideos
);
})
.catch(error => {
console.error(error);
});
});



})
.catch(error => {
console.error(error);
});
}
})
.catch(error => {
console.error(error);
});

}

感谢您的帮助

最佳答案

我已经修复了您的代码并验证了它可以与 YouTube API 配合使用。

首先,通过替换创建异步函数:

service.channels.list({
part: 'contentDetails',
id: inputs.ytbIdChannel,
key: youtubeApiKey,
})
.then(res => {

与:

service.channels.list({
part: 'contentDetails',
id: inputs.ytbIdChannel,
key: youtubeApiKey,
})
.then(async res => {

然后,为了更正,您需要将 if (res.data.items[0].contentDetails.latedPlaylists.uploads) block 的内容替换为以下代码:

let uploadsId = channels.data.items[0].contentDetails.relatedPlaylists.uploads;

// With the uploadID, get all uploaded videos
let videos = await service.playlistItems.list({
part: 'snippet',
playlistId: uploadsId,
maxResults: '12',
key: youtubeApiKey,
})
this.youtbeVideos = videos.data.items;

// For each videos in list, inject the statistics object and return all videos
for (let video of this.youtbeVideos) {
let videoId = video.snippet.resourceId.videoId

let stats = await service.videos.list({
part: 'statistics',
id: videoId,
key: youtubeApiKey,
})
Object.assign(video, stats.data.items[0].statistics)
}

return exits.success(
this.youtbeVideos
);

我所做的两个关键更改是:

  1. 使用await这样 this.youtbeVideos 的迭代会暂停,以便在继续之前检索统计信息
  2. 将返回和对 exits.success 的调用移到循环之外,以便在添加所有统计信息后返回一次数据

您可以run my working copy在线此处 - 只需添加您的 YouTube API key 即可。

当列表返回时,它将包含预期的所有统计信息。

关于node.js - Node JS 出现问题并 promise 在完成前返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60008897/

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