Javascript js:while-true循环中的承诺
我在从youtube播放列表中检索所有数据时遇到一些困难。这是我的密码:Javascript js:while-true循环中的承诺,javascript,asynchronous,promise,youtube-api,Javascript,Asynchronous,Promise,Youtube Api,我在从youtube播放列表中检索所有数据时遇到一些困难。这是我的密码: function getApiUrl(nextPageToken) { return '<api_url>' + '&playlistId=' + '<playlistId>' + (nextPageToken !== null ? '&pageToken=' + nextPageToken : ''); } function getPlaylist() { var
function getApiUrl(nextPageToken) {
return '<api_url>' + '&playlistId=' + '<playlistId>' + (nextPageToken !== null ? '&pageToken=' + nextPageToken : '');
}
function getPlaylist() {
var titles = [],
nextPageToken = null,
url = getApiUrl(null);
while(true) {
// returns new Promise(...)
doRequest(url).then(data => {
// process data : push items to titles array
nextPageToken = data.nextPageToken;
});
if (nextPageToken === undefined) {
break;
}
url = getApiUrl(nextPageToken);
}
// returns empty array
return titles;
}
函数getapirl(下一个getoken){
返回'+'&playlid='+''+(nextpGetOken!==null?'&pageToken='+nextpGetOken:'');
}
函数getPlaylist(){
var titles=[],
NEXTPGETOKEN=null,
url=getApiUrl(空);
while(true){
//返回新承诺(…)
doRequest(url)。然后(数据=>{
//流程数据:将项目推送到标题数组
nextPageToken=data.nextPageToken;
});
如果(nextPageToken==未定义){
打破
}
url=getApiUrl(下一个GetToken);
}
//返回空数组
返回标题;
}
试图在数据处理程序中中断循环会导致
语法错误:非法中断语句
我认为可以使用wait
操作符
函数getapirl(下一个getoken){
返回'+'&playlid='+''+(nextpGetOken?'&pageToken='+nextpGetOken:'');
}
异步函数getPlaylist(){
var titles=[],
NEXTPGETOKEN=null,
url=getApiUrl(空);
//返回新承诺(…)
nextPageToken=等待doRequest(url);
url=getApiUrl(下一个GetToken);
//返回空数组
返回标题;
}
我想您可以使用wait
操作员
函数getapirl(下一个getoken){
返回'+'&playlid='+''+(nextpGetOken?'&pageToken='+nextpGetOken:'');
}
异步函数getPlaylist(){
var titles=[],
NEXTPGETOKEN=null,
url=getApiUrl(空);
//返回新承诺(…)
nextPageToken=等待doRequest(url);
url=getApiUrl(下一个GetToken);
//返回空数组
返回标题;
}
您遇到的问题是,循环是同步的,但nextPageToken的分配是异步的。实际上我不确定,但我想使用递归来完成这项工作
function getList(url){
return doRequest(url).then(data => {
if(data.nextPageToken !== undefined){
//titles.push()... whatever you're putting into titles
var nextUrl = getApiUrl(data.nextPageToken);
return getList(nextUrl);
}else{
return;
}
});
}
您遇到的问题是,循环是同步的,但nextPageToken的分配是异步的。实际上我不确定,但我想使用递归来完成这项工作
function getList(url){
return doRequest(url).then(data => {
if(data.nextPageToken !== undefined){
//titles.push()... whatever you're putting into titles
var nextUrl = getApiUrl(data.nextPageToken);
return getList(nextUrl);
}else{
return;
}
});
}
使用与生成器函数无关的无限循环通常不是一个好主意。这里应该做的是将变量设置为true,当
nextPageToken===undefined
时,将变量设置为false。这将阻止这场战争loop@SterlingArcher还是解决不了空的问题array@SterlingArcher既然对nextPageToken的分配是异步的,那么这难道不起作用吗?您必须将所有代码向上滚动到中,然后才能正常工作。忙于等待承诺可能弊大于利。使用与生成器函数无关的无限循环通常不是一个好主意。这里应该做的是将变量设置为true,当nextPageToken===undefined
时,将变量设置为false。这将阻止这场战争loop@SterlingArcher还是解决不了空的问题array@SterlingArcher既然对nextPageToken的分配是异步的,那么这难道不起作用吗?您必须将所有代码向上滚动到中,然后才能正常工作。忙着等待承诺可能弊大于利。getPlaylist
必须标记为asyncoh,也许我是糊涂了。我认为OP需要浏览多页。我试着想办法将async/await集成到while循环中,但没有成功。getPlaylist
必须标记为async哦,也许我有点困惑。我认为OP需要浏览多页。我试着想办法将async/await集成到while循环中,但没有成功。