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

184
Visualizações
Cómo detectar un error en una función de devolución de llamada asíncrona en el bloque externo de prueba/captura

OK,

Así que estoy usando el marco del titiritero y tengo una función asíncrona que interactúa con una página web. Esta función hace clic y selecciona elementos de una página web mientras espera que el tráfico de la página esté inactivo. Esta función funciona la mayor parte del tiempo, pero a veces se detiene.

Quiero poder establecer un tiempo de espera para que, si la función tarda más de una cierta cantidad de tiempo, arroje un error y pueda ejecutarla nuevamente. Hasta ahora, parece que no puedo hacer que esto funcione porque no puedo obtener la función de devolución de llamada que paso a setTimeOut() para 'interactuar' con la función externa.

Mi código se ve así:

 const scrap_webtite = async page => { /* scrap the site */ try{ // catch all // set timeout let timed_out_ID = setTimeout(()=> throw "timeOut", 1000); // run the async let el = await sometimes_stalls_function(page); // if function ran finished correcly clearTimeout(timed_out_ID); // save el save_el(el); } }catch(e){ console.error("Something went wrong!", e); // this makes the function run again // here is where I want to ideally catch the timeout error return false } }

También intenté envolver la función setTimeOut en una Promise según esta publicación y usar las devoluciones de llamada .then().catch() para tratar de detectar el error sin éxito.

Disculpe si es una pregunta tonta, gracias por su ayuda.

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

0

intente convertir todo en el bloque de try en una promesa

 const scrap_webtite = async page => { /* scrap the site */ try{ // catch all return await new Promise(async(r,j)=>{ // set timeout let timed_out_ID = setTimeout(()=>j("timeOut"),1000); // run the async let el = await sometimes_stalls_function(page); // if function ran finished correcly clearTimeout(timed_out_ID); // save el r(save_el(el)); }) }catch(e){ console.error("Something went wrong!", e); // this makes the function run again // here is where I want to ideally catch the timeout error return false } }
about 4 years ago · Juan Pablo Isaza Relatório

0

El problema con el que se está encontrando es esencialmente que el error arrojado en setTimeout() no está relacionado con el flujo de su función y, por lo tanto, no puede detectarse allí. Esencialmente, puede pensar en la función de devolución de llamada del temporizador como una función "separada": las variables del ámbito principal seguirán estando disponibles, pero no puede return un valor al principal directamente, etc.

Para solucionar este problema, tiene algunas opciones, Promise.race() es una posible solución. La idea es hacer primero una versión asíncrona de un tiempo de espera:

 const rejectAfter = (timeout) => { return new Promise((resolve, reject) => { setTimeout(() => reject(), timeout); }); };

Luego, extraiga su lógica comercial en una función asíncrona separada a-la:

 const doTheThing = async () => { // TODO: Implement };

Y finalmente, en su función de raspado, use Promise.race() para usar el resultado de cualquiera de los dos que termine primero:

 const scrape = async (page) => { try { const el = await Promise.race([ rejectAfter(1000), doTheThing() ]); } catch(error) { // TODO: Handle error } }
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