我正尝试使用以下代码从YouTube播放列表中获取全部137个视频:
function loadVideos() {
let pagetoken = '';
let resultCount = 0;
const mykey = "***********************************";
const playListID = "PLzMXToX8Kzqggrhr-v0aWQA2g8pzWLBrR";
const URL = `https://www.googleapis.com/youtube/v3/playlistItems?
part=snippet
&maxResults=50
&playlistId=${playListID}
&key=${mykey}`;
fetch(URL)
.then(response => {
return response.json();
})
.then(function(response) {
resultCount = response.pageInfo.totalResults;
console.log("ResultCount: " + resultCount);
pagetoken = response.nextPageToken;
console.log("PageToken: " + pagetoken);
resultCount = resultCount - 50;
console.log("ResultCount: " + resultCount);
while (resultCount > 0) {
const URL = `https://www.googleapis.com/youtube/v3/playlistItems?
part=snippet
&maxResults=50
&playlistId=${playListID}
&key=${mykey}
&pageToken=${pagetoken}`;
fetch(URL)
.then(response => {
return response.json();
})
.then(function(response) {
pagetoken = response.nextPageToken ? response.nextPageToken : null;
console.log("PageToken: " + pagetoken);
});
resultCount = resultCount - 50;
}
})
.catch(function(error) {
console.log("Looks like there was a problem: \n", error);
});
} // End of loadVideos function
// Invoking the loadVideos function
loadVideos();
前50个视频已加载 后50个视频也被加载 但是,我的脚本没有加载列表中剩余的37个视频,而是再次加载了前50个视频。
页面令牌似乎没有针对第三次请求进行更新。
我的代码有什么问题?
答案 0 :(得分:4)
您不需要使用50 - maxResults
进行数学运算,只需查找nextPageToken
并让代码在有新令牌的情况下重新调用api。
例如
function getUrl(pagetoken) {
var pt = (typeof pagetoken === "undefined") ? "" :`&pageToken=${pagetoken}`,
mykey = "************",
playListID = "PLzMXToX8Kzqggrhr-v0aWQA2g8pzWLBrR",
URL = `https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=50&playlistId=${playListID}&key=${mykey}${pt}`;
return URL;
}
function apiCall(npt) {
fetch(getUrl(npt))
.then(response => {
return response.json();
})
.then(function(response) {
if(response.error){
console.log(response.error)
} else {
responseHandler(response)
}
});
}
function responseHandler(response){
if(response.nextPageToken)
apiCall(response.nextPageToken);
console.log(response)
}
apiCall();
如果您看到api进行了3次调用,因为在第三次之后没有nextPageToken
答案 1 :(得分:1)
您正在遍历异步功能而无需等待响应。尝试在函数声明之前添加async,然后在提取之前等待...
function loadVideos() {
// ...
.then(async function(response) {
// ...
while (resultCount > 0) {
// ...
await fetch(URL)
.then(response => {
// ...
或者,如果您的设置不支持异步/等待,请使用bluebird的Promise.mapSeries和一个长度为resultCount的空数组,类似this
答案 2 :(得分:1)
我恳请您从代码中删除您的API密钥,然后简单地放其他符号或将其留空以供他人理解。