Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

190
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda