Conversión de un bucle javascript para ser asíncrono y funcional

John Harrison:

Estoy tratando de hacer que el código siguiente más funcional y asíncrona, pero no tener mucha suerte!

Por lo que las llamadas a la API sólo puede tener 5 Identificación de a la vez, por lo que he creado splitListOfIdsy estoy recorriendo it.The segunda llamada a la API depende de la primera llamada a la API

El siguiente código funciona, pero es lento y me da errores ESLINT con este código y aunque quieran hacerlo más funcional y asincrónica. He estado tratando de utilizar promesas pero no sabe cómo hacerlo. Lo ideal sería que quieren deshacerse del forbucle.

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)
}
Jacob:

Si esta API le permite hacer solicitudes en paralelo, se puede tomar este tipo de enfoque:

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;
}));

Dependiendo de lo que están haciendo las API en el fondo, esto le puede meter en problemas si tienes demasiadas cosas en paralelo. Si ese es el caso, entonces es necesario implementar algún tipo de mecanismo de paralelismo máximo, algo como esto (no probado, aunque probablemente hay bibliotecas para esto ya):

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;
}));

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=320523&siteId=1
Recomendado
Clasificación