我正在使用Axios在ReactJS应用程序中接触SongKick的REST API。
我不知道我要发出多少个请求,因为在每个请求中我可以获取的数据都是有限的,因此在每个请求中我都需要询问不同的页面。
为此,我使用了一个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
调用是异步的,因此我知道我的代码不是最优的,不应这样写,但是我搜索了这种问题,找不到合适的解决方案。 / p>
有什么方法可以知道函数中所有异步代码何时完成? 是否有另一种方法可以从REST API中获取所有页面而不进行循环,因为使用我的代码,尽管我得到了空的结果,这将导致调用额外的请求(因为它是异步的)?
答案 0 :(得分:2)
实际上,您的代码将使引擎崩溃,因为DECLARE @table1 TABLE (path varchar(max));
declare @iter int
INSERT INTO @table1 (path) VALUES ('a_bb_ccc_dddd')
INSERT INTO @table1 (path) VALUES ('111_222_333_444')
INSERT INTO @table1 (path) VALUES ('')
select path, dbo.iteration(path,'_',3)
from @table1 a
循环将永远运行,因为它永远不会停止,异步请求已启动,但它们永远不会结束,因为线程被循环阻塞了。
要解决此问题,请使用while
/ async
等待请求,然后再继续循环,因此实际上循环不是无限的:
await