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

139
Visualizações
El bloque Catch no se ejecuta inmediatamente después de que se lanza una excepción en el bloque Try

Tengo un poco de código Javascript, que no se comporta como esperaba. ¿Alguien puede decirme qué está pasando aquí?

Aquí hay una versión simplificada:

 let recordsProcessed = 0 await parser(fileBuffer, // Process row async (row: Record<string, any>) => { recordsProcessed += 1 try { console.log('Processing record', recordsProcessed) await processRow(row) } catch (e) { console.log('Failure at record', recordsProcessed) } } ) async parser(fileBuffer: Buffer, rowCb: Function, ...) : Promise<number> { ... return new Promise((resolve, reject) => { parseFile(fileBuffer, options) .on('error', (error:any) => reject(error)) .on('data', async row => await rowCb(row)) .on('end', (count: any) => resolve(count)) }) ... }

El analizador () aquí es una función asíncrona, pero también llama a algunas devoluciones de llamada que se le pasan (solo muestro una aquí, pero hay varias). Llama a la devolución de llamada rowCb() para cada fila en un archivo.

Es el bloque try/catch dentro de la devolución de llamada asíncrona que no se comporta como esperaba. Estoy usando un archivo de prueba, con tres filas, lo que hará que cada llamada a processRow() genere una excepción. Entonces, espero que la salida de console.logs sea:

 Processing record 1 Failure at record 1 Processing record 2 Failure at record 2 Processing record 3 Failure at record 3

Pero en lugar de eso estoy recibiendo esto:

 Processing record 1 Processing record 2 Processing record 3 Failure at record 3 Failure at record 3 Failure at record 3

¿Por qué está pasando esto? Dado que estoy esperando processRow(), ¿no debería estar en el mismo alcance que el bloque try/catch y, por lo tanto, catch() debería procesarse inmediatamente después de que processRow() arroja una excepción?

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

0

Si está procesando varias líneas, parseFile() debe tener algún bucle dentro. No está claro si es su código o si proviene de alguna biblioteca, pero ese ciclo espera funcionar con devoluciones de llamada asincrónicas o no. Quizás esas options no mostradas también afecten esto.

Si usó un bucle con await , el resultado sería lo que espera:

 async function thrower(i) { throw "throwing " + i; } let somevariable = 0; async function wrapper(i) { try { somevariable++; console.log("calling", i, "(" + somevariable + ")"); await thrower(i); } catch (x) { console.log("caught", x, "(" + somevariable + ")"); } } (async function() { for await (let i of [1, 2, 3]) // <-- async-aware loop wrapper(i); })()

Sin embargo, si no usa await , el ciclo progresa inmediatamente cuando wrapper() encuentra su propia línea de await :

 async function thrower(i) { throw "throwing " + i; } let somevariable = 0; async function wrapper(i) { try { somevariable++; console.log("calling", i, "(" + somevariable + ")"); await thrower(i); } catch (x) { console.log("caught", x, "(" + somevariable + ")"); } } (async function() { for (let i of [1, 2, 3]) // <-- async-unaware loop wrapper(i); })()

Y si es un antiguo forEach() , entonces no importa incluso si intenta await :

 async function thrower(i) { throw "throwing " + i; } let somevariable = 0; async function wrapper(i) { try { somevariable++; console.log("calling", i, "(" + somevariable + ")"); await thrower(i); } catch (x) { console.log("caught", x, "(" + somevariable + ")"); } } (async function() { //[1, 2, 3].forEach(wrapper); // <- would be enough to produce the same output [1, 2, 3].forEach(async function(i){ await wrapper(i); // <- absolutely futile attempt to wait, // forEach just can't work asynchronously }); })()

about 4 years ago · Juan Pablo Isaza Relatório

0

Debe agregar una nueva variable dentro del analizador para obtener el número del registro actual. Debería usar esa variable en lugar de la global.

 let recordsProcessed = 0 await parser(fileBuffer, // Process row async (row: Record<string, any>) => { recordsProcessed += 1 let thisRecordNum = recordsProcessed; try { console.log('Processing record', thisRecordNum) await processRow(row) } catch (e) { console.log('Failure at record', thisRecordNum) } } )
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