【问题标题】:How to make second GraphQL mutation after first one is completed in loop如何在第一个循环完成后进行第二个 GraphQL 突变
【发布时间】:2022-01-25 13:32:54
【问题描述】:

这里我有一个场景,其中我有一个数组,其中包含一些要通过 GraphQL 突变添加到数据库中的项目。

我正在循环发送该突变,它工作正常。

但是当我检查我的数据库时发生了一些不匹配,假设我在数组中有 10 个项目并且请求被快速提出,所以发生的只是 2 或 3 个项目被添加到数据库中。

  • 我尝试的第一个解决方案是使用Promise.all,但它不起作用。
  • 我想到的第二件事是将当前索引发送到该突变,成功后它将返回相同的index,因此我根据该发送另一个项目,但我很困惑如何发送@ 987654323@ 和 variables 以及如果需要,但不知道它是否会返回给我。

我附上了我的一些代码 sn-ps 以获得更多想法:

import { useMutation } from "@apollo/client";

// Req in loop
const updateDataInLoop = (cartId, strapiId) => {
      for (let i = 1; i < items.length; i++) {
        updateReq({
          variables: {
            // API variables
          },
        });
      }
  };

// graphql api
const [updateReq] = useMutation(UPDATE_MUTATION, {
    onCompleted: (data) => {
      // after this I've to send another req
     },
  });

【问题讨论】:

    标签: reactjs redux graphql redux-saga graphql-mutation


    【解决方案1】:

    问题是您没有等待所有这些 GraphQL 突变。基本上,您一次发送多个请求,即使突变返回一个承诺,这反过来又转化为实际在数据库中更新/创建的少数产品。 你应该这样做:

    import { useMutation } from "@apollo/client";
    // Req in loop
    const updateDataInLoop = (cartId, strapiId) => {
          for (let i = 1; i < items.length; i++) {
            updateCartMutation(variable)
          }
      };
    
    //make an async mutation
    const updateCartMutation=async (variable)=>await updateReq({
              variables: {
                // API variables
              },
            });
    
    // graphql api
    const [updateReq] = useMutation(UPDATE_MUTATION, {
        onCompleted: (data) => {
          // after this I've to send another req
         },
      });
    

    【讨论】:

    • 谢谢,彼得的回答,我会检查这个。这是我在updateReq onCompleted 方法中要做的事情,否则它会在 await 中自动返回?
    • @AkashChavda 你不需要做任何事情
    • 我试过你的逻辑,但实际上并没有工作所有请求都一起触发
    • @AkashChavda 请求可能被批处理 apollographql.com/blog/apollo-client/performance/…
    • 我可以向updateReq 发送代表当前数据的index 吗?
    【解决方案2】:

    经过一些令人头疼的操作,我终于找到了一个可行的解决方案。

    // Req in loop
    const updateDataInLoop = async (cartId, strapiId) => {
          for (let i = 1; i < items.length; i++) {
            try { 
             await updateReq({
               variables: {
                 // API variables
               },
             });
             continue;
            } catch e {
              break;
            } 
          }
      };
    
    // graphql api
    const [updateReq] = useMutation(UPDATE_MUTATION);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-28
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      相关资源
      最近更新 更多