使用并行异步请求处理错误

Posted

技术标签:

【中文标题】使用并行异步请求处理错误【英文标题】:Handle errors with parallel async requests 【发布时间】:2019-05-13 05:15:56 【问题描述】:

我有 6 个异步请求。如果其中一个出错,返回 404,其他请求也不起作用。我使用async.parallel 提出这些请求。当其中一个请求失败时,我正在尝试提出其他请求。但我做不到。

这是我的代码:

    async.parallel(
      request1: async (callback) => 
        const [err, result] = await to(this.$store.dispatch('myAction1', 
          id: this.$route.params.id,
        ));
        callback(err, result);
      ,
      request2: async (callback) => 
        const [err, result] = await to(this.$store.dispatch('myAction2', 
          params: 
            id: this.$route.params.id,
            page: this.page,
            size: this.size,
          ,
        ));
        callback(err, result);
      ,
      request3: async (callback) => 
        const [err, result] = await to(this.$store.dispatch('myAction3', 
          data: 
            filters: this.inputs.filters,
            projections: this.inputs.projections,
            showTotalCount: this.inputs.showTotalCount,
          ,
          params: 
            page: this.page,
            size: this.size,
          ,
        ));
        callback(err, result);
      ,
      request4: async (callback) => 
        const [err, result] = await to(this.$store.dispatch('myAction4'));
        callback(err, result);
      ,
      request5: async (callback) => 
        const [err, result] = await to(this.$store.dispatch('myAction5', 
          id: this.$route.params.id,
        ));
        callback(err, result);
      ,
      request6: async (callback) => 
        const [err, result] = await to(this.$store.dispatch('myAction6', 
          params: 
            id: this.$route.params.id,
          ,
        ));
        callback(err, result);
      ,
    , (err, results) => 
      if (err) 
        // Show error message when one of them fails
      
      // doing something when all requests success and hide the page loader.
      this.hidePageLoader();
    );

如果这些请求中的一个返回 404,则此代码始终显示页面加载器,我想将失败的请求作为 null 传递给我的 results 对象或返回其他结果,而 results 对象中的请求没有失败。我怎样才能使它正确

【问题讨论】:

【参考方案1】:

为了让其他任务继续处理,即使其他任务失败,您需要将任务推送到一个数组,其中每个任务都包含在async.reflect 中,并将任务数组设置为@987654323 的第一个参数@。

例如:

async.parallel([
 async.reflect((callback) => 
   return callback(null, "one");
 ),
 async.reflect((callback) => 
   return callback("error");
 ),
 // another tasks
], function(error, results) 
  if(error)
    return cb(error)

  // results[0].value ->> "one"
  // results[1].error ->> "error"

  return cb(results)
)

来源:Async Documentationutils>>reflect

【讨论】:

以上是关于使用并行异步请求处理错误的主要内容,如果未能解决你的问题,请参考以下文章

jQuery的$.ajax方法支持同时创建多个异步ajax请求吗?而且这些ajax对象必须是并行处理的

同步异步,并发并行概念的理解

由于异步问题,并行 HttpClient 请求超时?

异步并行请求 - 部分渲染

并发与异步

并行请求多个异步接口