Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript js:while-true循环中的承诺_Javascript_Asynchronous_Promise_Youtube Api - Fatal编程技术网

Javascript js:while-true循环中的承诺

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

我在从youtube播放列表中检索所有数据时遇到一些困难。这是我的密码:

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循环中,但没有成功。