如何在JavaScript中处理循环内的异步代码?
我正在使用Axios接触ReactJS应用程序中SongKick的RESTAPI 我不知道我将提出多少请求,因为在每个请求中,我可以获得的数据是有限的,所以在每个请求中,我需要请求不同的页面 为此,我使用for循环,如下所示:如何在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.
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;
}
}