非同期で機能することがjavascriptのループの変換

ジョン・ハリソン:

私は、次のコードは、より多くの機能および非同期にしようとしたが、運の多くを持っていませんよ!

API呼び出しが唯一の5 IDのは、私が作成した理由である時、に取ることができるようにsplitListOfIdsとit.The第2のAPI呼び出しをループしています最初のAPI呼び出しに依存しています

作品次のコードが、低速であると私はかかわらず、このコードでESLINTエラーを取得し、それはより多くの機能と非同期にしたいです。私は約束を使用しようとしているが、それを行う方法がわからないてきました。理想的に取り除くしたいforループ。

const splitListOfIds = [
    [1,2,3,4,5],
    [6,7,8,9,10]
]

const allPolicies = []

for (let i = 0; i < splitListOfIds.length; i++) {
    const people = await peopleApi.getPeople(splitListOfIds[i])
    const policyIds = people.map(p => p.policyId)
    const policies = await policyApi.getPolicyDetails(policyIds)
    allPolicies.push(policies)
}
ジェイコブ:

このAPIを使用すると、並列に要求を行うことができます場合は、この種のアプローチを取ることができます。

const allPolicies = await Promise.all(splitListOfIds.map(async peopleIds => {
  const people = await peopleApi.getPeople(peopleIds)
  const policyIds = people.map(p => p.policyId)
  const policies = await policyApi.getPolicyDetails(policyIds)
  return policies;
}));

APIは、バックグラウンドで何をしているかに応じて、これはあなたが並列にあまりにも多くのものを持っている場合はトラブルにあなたを得ることができます。その場合は(ライブラリがすでにこのためにおそらくありますが、テストされていない)、あなたは、最大並列処理機構のいくつかの種類を実装するためにこのようなものが必要になります。

async function processInParallel(maxParallelism, data, taskFn) {
  const results = [];
  const inFlight = new Set();  

  for (let i = 0; i < data.length; i++) {
    while (inFlight.size >= maxParallelism) {
      // Wait for at least one to complete
      await Promise.race([...inFlight]);
    } 

    const task = taskFn(data[i]).then(result => {
      results.push(result);
      inFlight.delete(task);
    });
    inFlight.add(task);
  }

  await Promise.all([...inFlight]);

  return results;
}

// Usage
const allPolicies = await processInParallel(10, splitListOfIds, async peopleIds => {
  const people = await peopleApi.getPeople(peopleIds)
  const policyIds = people.map(p => p.policyId)
  const policies = await policyApi.getPolicyDetails(policyIds)
  return policies;
}));

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=320512&siteId=1