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

271
Visualizações
En React useEffect, ¿cómo se filtran las actualizaciones de estado entre el código de ejecución prolongada?

Tengo problemas para que aparezca mi estado de carga antes de que se ejecute longRunningCode. Intenté hacerlo asíncrono sin éxito.

 const [loadingStatus, setLoadingStatus] = useState(undefined); const [myAction, setMyAction] = useState(undefined); const longRunningCode = () => { const file = // synchronous code to generate a gzipped File object return file; } // also tried // const longRunningCode = async () => { // ... useEffect(() => { if (myAction) { setLoadingStatus('Do the thing...') const result = longRunningCode() // also tried `await` with async version // ... setLoadingStatus(undefined) setMyAction(undefined) } }, [myAction]) //... return ( <div> <p>{loadingStatus}</p> <button onClick={() => setMyAction({})}>Generate file</button> </div> )
about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

Estaba pensando en algo como:

 const [loadingStatus, setLoadingStatus] = useState(undefined); const [myAction, setMyAction] = useState(undefined); const longRunningCode = () => { return new Promise(resolve, reject)=>{ const file = // synchronous code to generate a File object resolve(file); } } useEffect(() => { if (myAction) { setLoadingStatus('Do the thing...') longRunningCode().then(file=>{ // ... setLoadingStatus(undefined) setMyAction(undefined) }) } }, [myAction]) //... return <p>{loadingStatus}</p><button onClick={() => setMyAction({})} />

**Editar: ** con setTimeout

 const [loadingStatus, setLoadingStatus] = useState(undefined); const [myAction, setMyAction] = useState(undefined); const longRunningCode = () => { const file = // synchronous code to generate a File object return file } } useEffect(() => { if (myAction) { setLoadingStatus('Do the thing...') //a 0 second delay timer waiting for longrunningcode to finish let timer = setTimeout(() =>{ longRunningCode() setLoadingStatus(undefined) setMyAction(undefined) }, 0); // clear Timmer on unmount return () => { clearTimeout(timer); }; } }, [myAction]) //... return <p>{loadingStatus}</p><button onClick={() => setMyAction({})} />
about 4 years ago · Juan Pablo Isaza Relatório

0

Las devoluciones de llamada useEffect solo pueden devolver una función undefined o destructora. En su ejemplo, ha pasado una función asíncrona que devuelve una Promesa. Puede ejecutarse o no, pero verá advertencias de React de que las devoluciones de llamada de useEffect se ejecutan sincrónicamente.

En su lugar, defina una función asíncrona y luego llámela.

 const [loadingStatus, setLoadingStatus] = useState(undefined); const [myAction, setMyAction] = useState(undefined); useEffect(() => { const doAction = async () => { if (myAction) { setLoadingStatus('Do the thing...'); const result = await longRunningCode(); // ... setLoadingStatus(undefined); setMyAction(undefined); } }; doAction(); }, [myAction]); //... return <p>{loadingStatus}</p><button onClick={() => setMyAction({})} />

De lo contrario, lo que ha escrito funcionará.

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