1

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

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

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

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

我附上了我的一些代码片段以获得更多想法:

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
     },
  });
4

2 回答 2

0

问题是您没有等待所有这些 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
     },
  });
于 2021-12-26T23:35:21.793 回答
0

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

// 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);
于 2022-01-12T12:55:12.700 回答