我正在使用Node.JS和"请求"图书馆https://github.com/request/request 我阅读了文档,尽管我只能请求来自频道的50个视频,但是从api服务器响应,有一个nextPageToken密钥,但我不明白如何让这个nextPageToken的请求链通过整条链。
`https://www.googleapis.com/youtube/v3/search?key=${key}&channelId=${channelId}&part=snippet,id&order=date&maxResults=50`;
我勾勒出这段代码
request({url:url}, function(err, response, body){
let data = JSON.parse(body);
for(let i = 0; i < Math.fround(data.pageInfo.totalResults / maxResults); i++){
let newUrl = url + '&pageToken=' + data.nextPageToken;
request({url: newUrl}, function(err, response, body){
newUrl = url + '&pageToken=' + JSON.parse(body).nextPageToken;
console.log(JSON.parse(body).nextPageToken);
})
}
})
在频道+450视频中,没有想到最佳解决方案并取得第一个请求的结果,除以所请求视频的最大数量,我得到9-10,然后每个周期结果10次,理论上每个请求都应该更新变量newUrl
之后,再次访问服务器以获取新数据,然后再使用新的nextPageToken。
怎么样?
答案 0 :(得分:0)
通常在处理API时,使用for循环是不公平的,您可能希望更慢地逐步执行请求。我的下面的示例使用简单的递归,但您可能希望在函数调用自身时添加超时。
let url = 'formatted url'
let videos = [];
function worker = (token, url) {
//use the standard url if there is no token
if (!token) {
request({url:url}, function(err, response, body){
let data = JSON.parse(body);
//do something with data
//if there is a next page token run worker again.
if (data.nextPageToken) {
let token = data.nexPageToken;
return worker(token, url);
} else {
console.log('fin');
}
} else {
//if there is a token use a new url
let nurl = 'url + page token';
request({url: url}, function(err, response, body) {
let data = JSON.parse(body);
//do something with data
//if there is a token run the worker again
if (data.nextPageToken) {
let token = data.nextPageToken;
return worker(token, url);
} else {
console.log('fin');
}
})
}
}
worker(null, url);