Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

244
Vistas
Promesas: realice un seguimiento de los identificadores de entrada/salida coincidentes

Digamos que necesito disparar varias solicitudes a través de una API para almacenar algunos datos en una base de datos. Cada entrada tiene un identificador único en el lado del cliente. Sin embargo, al insertarlo en el lado remoto, obtendrá un nuevo identificador único. Esto no se puede cambiar, es decir, no puedo obligar al lado remoto a usar los mismos identificadores. Este identificador (junto con algunos otros datos) se devuelve al cliente cuando se resuelve la Promesa. ¿Cuál es la mejor práctica para realizar un seguimiento de todo.

Ilustración:

 let inputValues = ["id1", "id2", "id3"]; for (val of inputValues) { api.insert(val).then( (result) => { console.log("new id:", result.id); }); }

Al final, imagino tener tal vez una matriz asociativa como

 [ "id1": "new ID for id1 from remote server", "id2": "new ID for id2 from remote server", "id3": "new ID for id3 from remote server" ]

Estoy bastante seguro de que podría escribir algo que hiciera el trabajo, pero probablemente sería un código horrible lleno de antipatrones. Así que prefiero preguntar primero: ¿cuál sería la forma recomendada de hacerlo?

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Parece que está haciendo sus actualizaciones en paralelo (en lugar de en serie), por lo que podría usar Promise.allSettled , que acepta una iteración (como una matriz) de promesas, espera a que todas se liquiden (se cumplan o se rechacen). ), y luego devuelve una matriz en el mismo orden que el iterable que le proporcionó. Luego puede recorrer y, para las actualizaciones exitosas, aplicar la nueva ID.

Algo como esto (en una función async ):

 const inputValues = ["id1", "id2", "id3"]; const results = await Promise.allSettled( inputValues.map(value => api.insert(value)) ); // Here, `results` and `inputValues` will be parallel arrays for (let i = 0; i < results.length; ++i) { const result = results[i]; if (result.status === "fulfilled") { const newId = result.value.id; // Successful update, `newId` is the new ID for `inputValues[i]` } }

Aquí hay un ejemplo, con las promesas que se liquidaron intencionalmente fuera de orden para demostrar que la matriz de resultados está en el mismo orden que la entrada iterable (ya que no estaba seguro de que ese fuera el caso):

 const api = { async insert(value) { const delay = value === "id2" ? 1000 : 200; await new Promise(resolve => setTimeout(resolve, delay)); console.log(`Fulfilling ${JSON.stringify(value)}`); return { id: `New ID for ${value}` }; } }; (async () => { const inputValues = ["id1", "id2", "id3"]; const results = await Promise.allSettled( inputValues.map(value => api.insert(value)) ); // Here, `results` and `inputValues` will be parallel arrays for (let i = 0; i < results.length; ++i) { const result = results[i]; if (result.status === "fulfilled") { const newId = result.value.id; const input = inputValues[i]; console.log(`input value = ${JSON.stringify(input)}, newId = ${JSON.stringify(newId)}`); } } })();

En eso puede ver que aunque la operación para "id2" tomó más tiempo que las de "id1" e "id3" , todavía está en la segunda posición en el resultado.


Si por alguna razón no puede usar una función async :

 const inputValues = ["id1", "id2", "id3"]; Promise.allSettled( inputValues.map(value => api.insert(value)) ) .then(results => { // Here, `results` and `inputValues` will be parallel arrays for (let i = 0; i < results.length; ++i) { const result = results[i]; if (result.status === "fulfilled") { const newId = result.value.id; // Successful update, `newId` is the new ID for `inputValues[i]` } } }) .catch(error => { // ...handle/report error... });
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda