微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 Apollo Client 和 GraphQL HoC 并行运行多个突变? 为每个请求创建和对象: 创建映射器函数: 执行请求:

如何解决如何使用 Apollo Client 和 GraphQL HoC 并行运行多个突变? 为每个请求创建和对象: 创建映射器函数: 执行请求:

我目前正在使用 GraphQL HoC 通过 props 传递突变。但是,我想同时运行一批突变,同时还可以进行错误处理并知道哪些突变失败了 - 能够再次运行失败的突变。我不知道我会运行多少个突变,这取决于我得到的 ID 数量,这些 ID 将在 props 中作为数组传递。

实现这一目标的最佳方法是什么?

我最初的想法是以某种方式在数组上使用 Map 方法并在每个数组上运行突变。我不知道如何使用这种方法跟踪哪些失败,我也不知道如何并行运行它们

突变看起来像这样:

updateUserAccount({userId,reason})

我需要并行运行 5-10 个之间的任何地方

我将使用 graphql HoC 通过 props 传递突变,以便我可以访问组件中的突变。我想再运行 2 次失败的。

解决方法

使用 Promise.all() 调用突变。您还需要创建一些映射器函数来控制某些请求失败时的尝试:

为每个请求创建和对象:

const ids = ["1","2","3"];
const meta = ids.map(id => ({
  id,fn: () => updateUserAccount({id,reason}),//--> mutation function
  attemps: 0,//--> <= 3
  status: null,//--> ["OK","ERROR"]
  data: null //-> response data,equal null if fails
}));

创建映射器函数:

在这里您可以控制功能尝试。请求将始终得到解决,这样您就无需担心被拒绝。如果请求在 3 次尝试后失败,您将解析数据等于 null 和状态等于错误的对象。

const mapper = item => {
  return new Promise(async resolve => {
    const call = async (attempts = 0) => {
      try {
        const data = await item.fn();
        resolve({ ...item,status: "OK",attempts,data });
      } catch (err) {
        ++attempts;
        if (attempts < 3) {
          call(attempts);
        } else {
          resolve({ ...item,status: "ERROR",data: null });
        }
      }
    };
    call();
  });
};

执行请求:

运行所有功能。你不会得到任何拒绝,映射器函数对此负责。
const run = () => {
  Promise.all(meta.map(mapper)).then(response => {
    console.log("Result:",response);
  });
};

run();

如果您需要知道哪个函数失败,只需检查响应对象:

const fails = response.filter(item => item.status === "ERROR");

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。