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

时间:2018-10-07 11:57:39

标签: javascript reactjs asynchronous axios

我正在使用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中获取所有页面而不进行循环,因为使用我的代码,尽管我得到了空的结果,这将导致调用额外的请求(因为它是异步的)?

1 个答案:

答案 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
相关问题