Pregunta: la salida del caso 1 es de 0 a 4, que está en orden, mientras que la salida del caso 2 es aleatoria.
Sé que la razón por la cual el resultado del caso 1 está en orden es que la solicitud se envía después de que llega el resultado de la solicitud anterior. En el caso 2 la solicitud no esperará el resultado de la solicitud anterior.
mi pregunta es si hay alguna manera de conservar el resultado del caso 2 en orden también?
caso 1
const main = async () => { const arr = Array.of(...[1,2,3,4,5]) for (let i=0;i<arr.length;i++) { console.log(`request:${i}`) const res = await request(i) console.log(res) } console.log("next step") } const request = (i:number):Promise<number> => { return new Promise<number>(((resolve, reject) => { setTimeout(()=>{ resolve(i) },Math.random() * 1000) })) }salida1
closure request:0 0 request:1 1 request:2 2 request:3 3 request:4 4 next stepcaso2
const main = async () => { const arr = Array.of(...[1,2,3,4,5]) await Promise.all(arr.map(async (v,i) => { console.log(`request:${v}`) const res = await request(v) console.log(`result:${res}`) console.log(res) })).catch((e) => { }) console.log("next step") } const request = (i:number):Promise<number> => { return new Promise<number>(((resolve, reject) => { setTimeout(()=>{ resolve(i) },Math.random() * 1000) })) } main()salida2
request:1 request:2 request:3 request:4 request:5 result:4 4 result:5 5 result:1 1 result:3 3 result:2 2 next stepPromise.all() devuelve una matriz de resultados en el mismo orden; simplemente no se resolverán en orden. Podría devolver la respuesta dentro de su promesa de request , y...
const [result1, result2, result3] = await Promise.all([promise1, promise2, promise3]);O si quisiera iterar sobre una matriz...
const results = await Promise.all([promise1, promise2, promise3]);Promise All debe ser una matriz de solicitud o promesa, en map () debe devolver la solicitud. prueba esto
const main = () => { const arr = Array.of(...[1,2,3,4,5]) Promise.all(arr.map((v,i) => { console.log(`request:${v}`) return request(v) })).then((res)=>{ res.forEach((val)=>{ console.log(`result:${val}`) }) }).catch((e) => { }) console.log("next step") } const request = (i)=> { return new Promise((resolve, reject) => { setTimeout(()=>{ resolve(i) }, Math.floor(Math.random() * 10)*1000) }) } main()