首页 > 解决方案 > 使用并行异步请求处理错误

问题描述

我有 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。我怎样才能正确地做到这一点

标签: javascriptajaxasynchronousvue.jsrequest

解决方案


即使其他任务失败,其余任务也能继续处理,您需要将任务推送到包含每个任务的数组中,并将任务async.reflect数组设置为async.parallel.

例如:

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)
})

来源:异步文档 utils >> reflect


推荐阅读