如何在while循环中处理异步JavaScript代码?

如何在while循环中处理异步JavaScript代码?,javascript,api,async-await,getjson,asynchronous-javascript,Javascript,Api,Async Await,Getjson,Asynchronous Javascript,我试图使用$.getJSON()从API获取数据,但遇到了一个问题。每次通话的最大结果是50次。但是,api提供了nextPageToken,用于从另一个页面获取数据。 在while循环(代码下面)中,我想在nextPageToken为null时中断循环,但如何通过回调函数实现这一点。我试着设置一面旗帜,但我意识到这也行不通 另外,我认为while循环不会像预期的那样工作,因为$.getJSON()将异步运行,nextpGetOken将保持null,循环将中断 总结:1。我想从每个页面获取数据。

我试图使用
$.getJSON()
从API获取数据,但遇到了一个问题。每次通话的最大结果是50次。但是,api提供了
nextPageToken
,用于从另一个页面获取数据。 在while循环(代码下面)中,我想在
nextPageToken
为null时中断循环,但如何通过回调函数实现这一点。我试着设置一面旗帜,但我意识到这也行不通

另外,我认为while循环不会像预期的那样工作,因为$.getJSON()将异步运行,
nextpGetOken
将保持
null
,循环将中断

总结:1。我想从每个页面获取数据。 2.我想知道如何打破while循环

let nextPageToken = null;
let flag = 0;
function getAll(){

    while(true){
        let pyl = {
            part: "snippet",
            key: key,
            nextPageToken: nextPageToken,
            maxResults: 50,
            playlistId: playlistId
        }

        $.getJSON(URL, pyl, pd=>{
            console.log(pd);
            arr.push(pd.nextPageToken);
            nextPageToken = pd.nextPageToken;

            // this is wrong
            if(nextPageToken == null) {
               flag = 1;
               break;  //This break statement is illegal
            } 
        });
        // This won't work too
        if(flag==0) break;
    }
}

getAll();

您需要在收到响应后调用该函数。下面是一个例子:

let标志=0;
函数getAll(下一个GetToken){
设pyl={
部分:“片段”,
钥匙:钥匙,
nextPageToken:nextPageToken,
最大结果:50,
playlid:playlid
}
$.getJSON(URL、pyl、pd=>{
控制台日志(pd);
arr.push(pd.nextPageToken);
nextPageToken=pd.nextPageToken;
//这是错误的
if(nextPageToken==null){
flag=1;
}否则{
flag=0;
getAll(下一个GetToken);
}
});
}
让startingToken;//不管这是什么

getAll(startingToken)
getJSON
封装在一个promise中,并使用async/awaitI添加的无限while循环从每页获取数据,因为每页的最大数据量是50。它适用于单个页面,但如何获得所有数据,比如203个数据。如果有203个,则调用203次(用于循环)。这将运行数千次(我想,这肯定是一个很大的数字),然后才会停止。无限循环很少是个好主意。在响应对象中,我得到了一个包含50项的数组。为了抓取剩下的,我必须要求下一页。响应对象中提供了nextPageToken。这就是我之所以使用无限循环的原因,因为上一页有nextpGetOken:Null,所以您需要使用递归。我将添加一个应该有效的示例。它可能需要修改以适合您的使用,但它是一个模板。