Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

192
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!