Слияние в объект из двух разных вызовов API

Я работаю над приложением для сравнения SDKS (их процент оттока и сбора). Я создал API с двумя отдельными конечными точками.

Первый сравнивает один SDK с другим и выводит эти данные для каждого SDK.

Второй — просто получает общую информацию об одном SDK.

Я объединяю эти объекты в один, чтобы можно было найти всю информацию об одном SDK.

Проблемы, которые у меня были ранее, и которые могут возникнуть (надеюсь, исправлены к настоящему времени): при установке объекта в конце с помощью setAllSdksInfo(objCopy) возникла проблема, при которой он не мог установить его нормально.

Я также получаю предупреждение ESLint, в котором говорится "Function declared in a loop contains unsafe references to variable(s) 'objCopy', 'objCopy', 'objCopy', 'objCopy', 'objCopy', 'objCopy', 'objCopy'" но, похоже, это не вызывает никаких проблем.

import React, { useEffect } from "react";
import MatrixSquare from "./MatrixSquare";

function Matrix({ selectedSdks, allSdksInfo, setAllSdksInfo, showMatrix, setShowMatrix }) {

  useEffect(() => {
    (async () => {
      const selectedSdksKeys = Object.keys(selectedSdks);
      if (!selectedSdksKeys.length) return;

      setShowMatrix(false);

      let comparedCount = 0;

      const notComparedKeys = [];

      selectedSdksKeys.forEach((key, i) => {
        for (let j = i + 1; j < selectedSdksKeys.length; j++) {
          if ( allSdksInfo?.[key]?.["churned_to"]?.hasOwnProperty( selectedSdksKeys[j])) {
            comparedCount += 1;
            if (comparedCount === 3) {
              setShowMatrix(true);
            }
          } else {
            notComparedKeys.push([key, selectedSdksKeys[j]]);
          }
        }
      });

      let objCopy = Object.assign({}, allSdksInfo);

      for (let i = 0; i < notComparedKeys.length; i++) {
        await fetch( `/api/sdk/churn?sdk1_id=${notComparedKeys[i][0]}&sdk2_id=${notComparedKeys[i][1]}`)
          .then((res) => res.json())
          .then((res) => {
            const copyPreviousObj = Object.assign({}, objCopy);
            objCopy = { ...objCopy, ...res };
            const resKeys = Object.keys(res);

            resKeys.forEach((key) => {
              const new_churned_to = objCopy[key]["churned_to"];
              const new_acquired_from = objCopy[key]["acquired_from"];

              if (copyPreviousObj[key]) {
                objCopy[key]["churned_to"] = {
                  ...new_churned_to,
                  ...copyPreviousObj[key]["churned_to"],
                };
                objCopy[key]["acquired_from"] = {
                  ...new_acquired_from,
                  ...copyPreviousObj[key]["acquired_from"],
                };
              }
            });
          });
      }

      selectedSdksKeys.forEach(async (id, i) => {
        if (allSdksInfo[id]?.["num_installed_apps"]) return;
        const res = await fetch(`/api/sdk/general_info?sdk_id=${id}`);
        const data = await res.json();
        objCopy[id]["num_installed_apps"] = data["num_installed_apps"];
        objCopy[id]["acquired_total"] = data["acquired_total"];
        objCopy[id]["churned_total"] = data["churned_total"];
      });

      setAllSdksInfo(objCopy);
      setShowMatrix(true);
    })();
  }, [selectedSdks]);

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *