Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

242
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!