处理承诺分批
#javascript #node #性能 #promise

同时运行代码

为了更快地执行执行,我们通常同时运行代码。
在JavaScript中同时运行代码的一种方法是同时致电许多诺言,而无需等待其结果,然后您使用Promise.all等待所有承诺完成的承诺。检查下面的示例:

const promiseA = asyncFnA();
const promiseB = asyncFnB();

const results = await Promise.all([promiseA, promiseB]);

上面的代码将同时执行asyncFnAasyncFnBPromise.all将等待两个执行以解决。

同时实现许多诺言

让我们看一下此代码

const users = await User.find(); // return all users in the database

const results = await Promise.all(users.map(async (user) => processUser(user));

此代码将在数据库中运行与users一样多的承诺。节点和JavaScript并不能很好地处理许多同时运行的承诺,因此可以很好地处理。
此代码可能会消耗大量的CPU和内存,并且会用尽内存。
为了解决这个问题,我们需要在批处理中处理所有这些承诺

处理承诺分批

export async function processPromisesBatch(
  items: Array<any>,
  limit: number,
  fn: (item: any) => Promise<any>,
): Promise<any> {
  let results = [];
  for (let start = 0; start < items.length; start += limit) {
    const end = start + limit > items.length ? items.length : start + limit;

    const slicedResults = await Promise.all(items.slice(start, end).map(fn));

    results = [
      ...results,
      ...slicedResults,
    ]
  }

  return results;
}

用法

const results = await processPromisesBatch(users, 100, processUser)

processPromisesBatch会将您的物品切成n大小为n的块,并同时执行n承诺。
这样可以确保它不会消耗大量的CPU和内存,并用尽事件循环。

综上所述

了解您的编程语言和运行时的局限性,可以帮助您设计解决方案以解决方案。

共享基于编程语言,运行时或框架的限制设计的解决方案。


woi
Woovi是一家创业公司,使购物者能够按照自己的意愿付款。为了实现这一目标,Woovi为商人提供即时付款解决方案接受订单。

如果您想与我们合作,我们是hiring


ElevateUnsplash

照片