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

问题描述

我试图使用$.getJSON()从API提取数据,但是遇到了问题。我可以得到的每个调用的最大结果为50。但是,API提供了nextPagetoken来从另一个页面获取数据。 在while循环中(下面的代码),我想在nextPagetoken为null时中断循环,但是我该如何从回调函数中做到这一点。我尝试设置一个标志,但我意识到这也行不通。

我还认为while循环无法按预期工作,因为$ .getJSON()将异步运行,而nextPagetoken将保持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 flag = 0;

function getAll(nextPageToken) {

  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;
    } else {
      flag = 0;
      getAll(nextPageToken);
    }
  });
}

let startingToken; // Whatever this should be

getAll(startingToken);