中止 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 内核

在获取API调用之前重新启动加载屏幕

事件中心检查点在服务器重新启动之前不获取事件

C Windows:生成子进程以停止和重新启动(超时后)父进程

android emulator sdk 10 api 29 重新挂载并重启后无法启动

.NET 与 Windows RT 蓝牙 LE API - 重新启动 Windows 后无法读取或写入设备