각 약속 사이에 지연이 있는 연속 실행 Promise

엔터티를 업데이트하는 끝점을 호출하고 싶었고 500개의 엔터티에 대해 수행하고 싶었습니다.
API 서버에는 "속도 제한"이 있었고 끝점을 병렬로 호출하고 속도 제한이 내 호출을 차단하기 때문에 Promise.all를 사용할 수 없었습니다.

그래서 끝점을 순차적으로 일괄 호출하는 스크립트를 작성하고 각 호출 전에 API 서버가 차단하지 않도록 2초를 기다리기로 했습니다.

그렇게 했더니 효과가 좋아서 나눠먹으면 좋을 것 같았어요!
이 작업을 수행하는 더 좋은 방법이 있습니까?

이 작업을 수행하는 방법은 0에서 시작하여 업데이트하려는 데이터 배열을 기반으로 추가하는 것입니다. 제가 가지고 있는 약속의 사슬에서 API 호출 전에 지연을 추가했습니다. 전달하는 값에 1을 추가하여 해당 숫자가 내 배열 길이와 같아질 때까지 데이터를 업데이트합니다.

import fetch from "node-fetch";
import { data } from "./data.js";

const bearerToken = ""

const updateData = (id) => {
  return fetch(
    `https://www.url/${id}`,
    {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        Authorization: `Bearer ${bearerToken}`,
      },
    }
  );
};

const delay = () => {
  console.log(`Waiting: 2 seconds.`);
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve("2");
    }, 2000);
  });
};

const startTime = Date.now();

const doNextPromise = async (id) => {
  delay()
    .then((x) => {
      console.log(
        `Waited: ${x} seconds now calling the endpoint for updating data ${data[id]}`
      );
      return updateData(data[id])
        .then((res) => {
          if (res.status !== 200) {
            throw `Error updating data ${data[id]}: ${res.status}`;
          }
          return res.json();
        })
        .then((res) =>
          console.log(`Response: ${JSON.stringify(res)} for data ${data[id]}`)
        )
        .catch((e) => console.log(`Error: ${e}`));
    })
    .then((res) => {
      id++;
      if (id < data.length) doNextPromise(id);
      else console.log(`Total: ${(Date.now() - startTime) / 1000} seconds.`);
    });
};
doNextPromise(0);

좋은 웹페이지 즐겨찾기