如何用Promise.Allsettled在嵌套循环中替换异步/等待?

发布于 2025-02-13 01:47:26 字数 717 浏览 0 评论 0原文

目前,我有以下代码从API中提取数据并将其解析到我的数据库中。最多需要5分钟,因为一天中最多可以举行50次聚会,每个会议都有十几个左右的比赛,每个活动最多都有20名跑步者。将其视为田径比赛。有时,此脚本正在插入10,000行。

// Create Meetings
for (const meeting of meetingList) {
  const newMeeting = await createMeeting(meeting);

  // Create/Update Events
  for (const event of meeting.events) {
    await createEvent(event, newMeeting.id);

    // Create/Update Competitors
    for (const competitor of event.competitors) {
      await createCompetitor(competitor);
      await createRacingEventCompetitor(competitor, event.id);
    }
  }
}

以前,我使用了Promise.allSettled()作为并行提出请求的好方法,节省了大量时间。当您像我的示例中一样,当您嵌套循环时,我该怎么做?

I currently have the below code pulling data from an API and parsing it into my database. It takes up to 5 minutes since there can be up to 50 meets in a day, each with a dozen or so seperate events and each event has up to 20 runners. Think of it like an athletics meet. Sometimes this script is inserting 10,000 rows.

// Create Meetings
for (const meeting of meetingList) {
  const newMeeting = await createMeeting(meeting);

  // Create/Update Events
  for (const event of meeting.events) {
    await createEvent(event, newMeeting.id);

    // Create/Update Competitors
    for (const competitor of event.competitors) {
      await createCompetitor(competitor);
      await createRacingEventCompetitor(competitor, event.id);
    }
  }
}

Previously, I've used Promise.allSettled() as a nice way to make requests in parallel, saving significant time. How do I do the same when you have nested loops like in my example?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

残月升风 2025-02-20 01:47:26

只需创建一个数组来持有承诺,称为Promises,然后

将每个请求推到该数组而不是等待它

并等待Plosis.alsettled.alsettled(承诺)

注意:因为new> newMeeting 所需

内部

const promises = [];
for (const meeting of meetingList) {
  const newMeeting = await createMeeting(meeting);

  for (const event of meeting.events) {
    promises.push(createEvent(event, newMeeting.id));

    for (const competitor of event.competitors) {
      promises.push(createCompetitor(competitor));
      promises.push(createRacingEventCompetitor(competitor, event.id));
    }
  }
}
await Promise.allSettled(promises);

请求

const promises = [];
for (const meeting of meetingList) {
    promises.push(
        createMeeting(meeting)
        .then(newMeeting => {
            const innerPromises = [];
            for (const event of meeting.events) {
                innerPromises.push(createEvent(event, newMeeting.id));

                for (const competitor of event.competitors) {
                    innerPromises.push(createCompetitor(competitor));
                    innerPromises.push(createRacingEventCompetitor(competitor, event.id));
                }
            }
            return Promise.allSettled(innerPromises);
        })
    );
}
await Promise.allSettled(promises);

Simply create an array to hold the promises, called promises for example

Then push each request to that array instead of awaiting it

And await Promise.allSettled(promises)

Note: since newMeeting is required for the inner requests, you still need to await that ... though, there is a way you can avoid that too

But, this is a start

const promises = [];
for (const meeting of meetingList) {
  const newMeeting = await createMeeting(meeting);

  for (const event of meeting.events) {
    promises.push(createEvent(event, newMeeting.id));

    for (const competitor of event.competitors) {
      promises.push(createCompetitor(competitor));
      promises.push(createRacingEventCompetitor(competitor, event.id));
    }
  }
}
await Promise.allSettled(promises);

Not sure this is the BEST way to make everything parallel, but it is one way

const promises = [];
for (const meeting of meetingList) {
    promises.push(
        createMeeting(meeting)
        .then(newMeeting => {
            const innerPromises = [];
            for (const event of meeting.events) {
                innerPromises.push(createEvent(event, newMeeting.id));

                for (const competitor of event.competitors) {
                    innerPromises.push(createCompetitor(competitor));
                    innerPromises.push(createRacingEventCompetitor(competitor, event.id));
                }
            }
            return Promise.allSettled(innerPromises);
        })
    );
}
await Promise.allSettled(promises);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文