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

如何在JavaScript中处理循环内的异步代码?,javascript,reactjs,asynchronous,axios,Javascript,Reactjs,Asynchronous,Axios,我正在使用Axios接触ReactJS应用程序中SongKick的RESTAPI 我不知道我将提出多少请求,因为在每个请求中,我可以获得的数据是有限的,所以在每个请求中,我需要请求不同的页面 为此,我使用for循环,如下所示: while (toContinue) { axios.get(baseUrl.replace('{page}',page)) .then(result => { ... if(result.

我正在使用Axios接触ReactJS应用程序中SongKick的RESTAPI

我不知道我将提出多少请求,因为在每个请求中,我可以获得的数据是有限的,所以在每个请求中,我需要请求不同的页面

为此,我使用for循环,如下所示:

while (toContinue)
{
    axios.get(baseUrl.replace('{page}',page))
        .then(result => {
              ...
            if(result.data.resultsPage.results.artist === undefined)
                toContinue = false;
        });
    page++;
}
现在,我面临的问题是,我需要知道我的所有请求何时完成。我知道Promise.All,但为了使用它,我需要知道要从中获取数据的确切URL,在我的情况下,我不知道它,直到我从请求中获得空结果,这意味着最后一个请求就是最后一个请求

当然,
axios.get
调用是异步的,所以我知道我的代码不是最优的,不应该这样编写,但是我搜索了这类问题,没有找到合适的解决方案

有没有办法知道函数中的所有异步代码何时完成?
有没有其他方法可以不循环地从REST API获取所有页面,因为使用我的代码会导致调用额外的请求(因为它是异步的),尽管我得到的结果是空的?

事实上,您的代码会使引擎崩溃,因为
循环将永远运行,因为它从不停止,异步请求已启动,但它们永远不会完成,因为线程被循环阻塞

要解决此问题,请使用
async
/
wait
在继续循环之前等待请求,因此实际上循环不是无限的:

async function getResults() {
 while(true) {
   const result = await axios.get(baseUrl.replace('{page}', page));
   // ...
   if(!result.data.resultsPage.results.artist)
     break;
 }
}