Tengo una función en la aplicación React donde se realizarán tres llamadas http diferentes:
const handleEditUser = async () => {
let p1, p2, p3;
p1 = UserUtils.setProjects(user, client, newProjects);
p2 = UserUtils.updateRights(user.id, userAuthority);
p3 = UserUtils.updateUserClient(client, user);
await Promise.all([p1, p2, p3]);
}
Mi problema es que la solicitud p2
se ejecutará antes de que la solicitud p1
haya finalizado por completo.
Me gustaría crear algunos tiempos de espera o algo más que permita ejecutar p2
después de que p1
haya terminado y p3
después de que p2
haya terminado.
Traté de reemplazar Promise.all[]
con las siguientes líneas, pero no resolvió mi problema:
await p1;
await p2;
await p3;
No hay necesidad de Promise.all[]
Su requisito es ejecutar promesas una tras otra, luego async con await funcionará aquí.
Puedes probar de esta manera.
const handleEditUser = async () => {
let p1, p2, p3;
p1 = await UserUtils.setProjects(user, client, newProjects);
p2 = await UserUtils.updateRights(user.id, userAuthority);
p3 = await UserUtils.updateUserClient(client, user);
}
Nota: los métodos de UserUtils deberían ser una promesa
Lo que está sucediendo:
const handleEditUser = async () => {
let p1, p2, p3
p1 = UserUtils.setProjects(user, client, newProjects) // request p1 starting
p2 = UserUtils.updateRights(user.id, userAuthority) // request p2 starting
p3 = UserUtils.updateUserClient(client, user) // request p3 starting
await Promise.all([p1, p2, p3]) // waiting for all of those to finish
// but requests are already fired
// or
await p1 // waiting for p1 to finish, p2 and p3 are running in parallel
await p2 // waiting for p2 to finish, p3 can still be running in parallel
await p3
}
Básicamente, cuando sus métodos UserUtils
realmente están iniciando el flujo de trabajo de las promesas. Por lo tanto, debería considerar esperar a que termine una promesa antes de comenzar el siguiente flujo de trabajo:
const handleEditUser = async () => {
await UserUtils.setProjects(user, client, newProjects)
await UserUtils.updateRights(user.id, userAuthority)
await UserUtils.updateUserClient(client, user)
}