我正在使用 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
之后,再次访问服务器以获取新数据, 和一个新的下一个页面令牌。
怎么做?
通常在处理 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);