Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

266
Visualizações
Promesas que se ejecutan cuando no deberían

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 .

confiado-austin-sifop

 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í.

about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

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) ];
about 4 years ago · Juan Pablo Isaza Relatório

0

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.

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda