Tengo varias mutaciones de db que me gustaría ejecutar todas a la vez, en lugar de sincrónicamente. El problema con el que me encuentro es que cuando intento insertar estas promesas en una matriz, se ejecutan.
¿Qué estoy haciendo mal aquí? También he intentado empujar funciones anónimas, como esta,
promises.push( async () => await someDbMutation1({ someForeignKey: "10" }), ) pero no se ejecutan durante Promise.all .
import * as React from "react"; import "./styles.css"; const someDbMutation1 = async ({ someForeignKey }) => { return await new Promise((resolve) => { console.log("should not enter"); return setTimeout(() => { resolve("aa"); }, 2000); }); }; const someDbMutation2 = async ({ someParameter }) => await new Promise((resolve) => setTimeout(() => { resolve(); }, 2000) ); export default function App() { const [loaded, setLoaded] = React.useState(false); React.useEffect(() => { init(); }, []); const init = React.useCallback(async () => { const promises = [ someDbMutation1({ someForeignKey: "10" }), someDbMutation2({ someParameter: "abc" }) ]; // await Promise.all(promises); setLoaded(true); }, []); return <div className="App">{loaded && <div>done</div>}</div>; } Esperaría que estas promesas en la matriz de promises se ejecuten durante una llamada a Promise.all , pero claramente ese no es el caso aquí. Me di cuenta de esto recientemente, cuando pasé null como un valor a una clave externa, momento en el que la restricción de clave en mi base de datos lo recogió y arrojó un error.
Ahora estoy preocupado, porque con frecuencia uso una matriz de promises y hago un bucle sobre objetos de db e push consultas de mutación en promises , ¡esto significa que cada solicitud se ejecuta dos veces! No estoy seguro de lo que me estoy perdiendo aquí.
Para la primera parte de su pregunta donde dice que no se está ejecutando:
promises.push( async () => await someDbMutation1({ someForeignKey: "10" }), )es porque está impulsando una función anónima, no una promesa: son dos cosas diferentes. Según el nombre de su matriz, creo que el comportamiento esperado sería que hiciera esto en su lugar:
promises.push( someDbMutation1({ someForeignKey: "10" }) )Si desea que todas las promesas se ejecuten en un solo momento, puede hacer esto en su lugar:
queries.push( async () => await someDbMutation1({ someForeignKey: "10" }), ) / ** -- some point later -- ** / const promises = queries.map(q => q()) // Execute queries const results = await Promise.all(promises) // Wait for queries to finish Además, tiene un malentendido sobre cómo funciona Promise.all aquí:
Esperaría que estas promesas en la matriz de promesas se ejecuten durante una llamada a Promise.all
Promise.all no ejecuta las promesas, espera a que se resuelvan las promesas. Hay una referencia aquí .
Entonces en esta parte:
const promises = [ someDbMutation1({ someForeignKey: "10" }), someDbMutation2({ someParameter: "abc" }) ]; En realidad, está ejecutando las funciones, de modo que si tuviera que console.log . registrar la matriz de promesas, se vería así:
[ Promise (unresolved), Promise (unresolved) ]; Y luego, después de await Promise.all() , la matriz de promises se vería así:
[ Promise (resolved: value), Promise (resolved: value) ];Problema 1: las promesas deben esperarse en el bloque que realmente las espera.
const someDbMutation1 = async ({ someForeignKey }) => { return new Promise((resolve) => { console.log("should not enter"); return setTimeout(() => { resolve("aa"); }, 2000); }); }; const someDbMutation2 = async ({ someParameter }) => await new Promise((resolve) => setTimeout(() => { resolve(); }, 2000) );El problema es que estás ejecutando las promesas. En su lugar, debe agregarlos a una matriz como funciones anónimas que llaman a su función con los parámetros que desea. Así que esto debería verse así. :
const init = React.useCallback(async () => { const promises = [ async () => someDbMutation1({ someForeignKey: "10" }), async () => someDbMutation2({ someParameter: "abc" }) ]; await Promise.all(promises); setLoaded(true); }, []);Espero que esta sea la respuesta que buscas.