中止 API 获取后重新启动异步函数
Posted
技术标签:
【中文标题】中止 API 获取后重新启动异步函数【英文标题】:Restart Async Function After Aborting API Fetch 【发布时间】:2019-05-03 00:48:51 【问题描述】:我正在创建一个 Node.js 模块,它获取电影标题列表并从 omdbapi.com 获取它们各自的元数据。
这些列表通常非常大,有时(我目前的互联网连接速度很慢)由于并发连接过多,连接会停止。所以我设置了一个超时/中止方法,在 30 秒后重新启动进程。
我遇到的问题是,每当我失去互联网连接或连接停止时,它都会退出该过程,并且不会重新启动连接。
示例:
async function getMetadata ()
const remainingMovies = await getRemainingMovies();
for (let i = 0; i < remainingMovies.length;i++)
const data, didTimeout = await fetchMetadata(remainingMovies[i]);
// Update "remainingMovies" Array...
if (didTimeout)
getMetadata();
break;
if (!didTimeout)
return data;
这显然是一个简化版本,但本质上是:
getMetadata
函数从全局范围内获取 remainingMovies
数组。
使用fetchMetadata
函数从服务器获取元数据。
检查连接是否超时。
如果是这样,它应该重新启动函数并尝试再次连接。
如果没有超时,则完成for loop
并继续。
【问题讨论】:
您可能希望使用try/catch
来获取和处理 catch 中的错误场景,因为使用 await
您的代码将在该行等待(函数的其余部分不会执行),直到返回从服务器否则它将出错,您没有处理程序。
【参考方案1】:
我猜你想要类似于下面的脚本。使用 try/catch 进行异步/等待的错误处理,这可能是您正在寻找的缺失难题。
async function getMetadata()
const remainingMovies = await getRemainingMovies();
remainingMovies.map(movie =>
try
return await fetchMetadata(movie);
catch (err)
return getMetadata();
);
【讨论】:
我什至没有想过在这种情况下使用Array.map()
。所以fetchMetadata
返回一个Object
,如果它抛出一个错误,它将捕获它并重新运行getMetadata
函数。我认为这是我正在寻找的。span>
以上是关于中止 API 获取后重新启动异步函数的主要内容,如果未能解决你的问题,请参考以下文章
fbprophet/Prophet 拟合函数中止并重新启动 Anaconda/Spyder Python 内核
C Windows:生成子进程以停止和重新启动(超时后)父进程