即使某些异步作业失败,如何保持功能不失败?

Posted

技术标签:

【中文标题】即使某些异步作业失败,如何保持功能不失败?【英文标题】:How to keep function not fail even if some async job fails? 【发布时间】:2022-01-22 17:07:24 【问题描述】:

我正在使用 Node.js(基于 Nest.js)制作后端服务器。每个路由处理程序主要查询/修改数据库(主要作用),有时会向外部服务器发送事件,留下日志等(副作用)。

我希望每个路由处理函数在只有副作用抛出错误并且主要效果运行良好(行为 1)时不会失败。而且我还希望副作用与主效果并行执行,这样可以减少执行每个路由处理函数的时间(行为2)。

如何在 javascript 中实现这种行为?我首先尝试了这段代码:

async routeHandler() 
  sideEffect().catch(console.error)

  await mainEffect();

但是,当sideEffect 函数抛出错误时,routeHandler 函数将失败。我可以尝试下一个,但它不满足行为2。

async routeHandler() 
  try 
    await sideEffect();
   catch (error) 
    console.error(error);
  

  await mainEffect();

【问题讨论】:

"sideEffect 函数抛出错误时" - 你的意思是它返回一个将拒绝的承诺吗?它似乎是一个异步函数,所以它@98​​7654321@。 sideEffect().catch(console.error); 是just what you want。 @Bergi 是的。 sideEffect 函数是异步的。但是,如果sideEffect 函数在routeHandler 函数解析之前拒绝,则mainEffect 函数的执行将停止。 不,它没有。除非效果以某种方式相关,否则mainEffect 不会受到影响。如果您仍然使用您的代码,请提供minimal reproducible example。 【参考方案1】:

也许您希望使用的是 Promise.allSettled?

并行运行异步任务 即使其他任务已被拒绝,其他异步任务仍应继续进行

docs 的链接:同时检查兼容性部分。

【讨论】:

以上是关于即使某些异步作业失败,如何保持功能不失败?的主要内容,如果未能解决你的问题,请参考以下文章

同步与异步

同步异步阻塞与非阻塞

同步异步阻塞非阻塞

Flowable入门系列文章63 - 失败重试

同步与异步 阻塞与非阻塞

如何在 javascript 中同步异步映射函数