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

219
Views
NodeJS: la función asíncrona aún detiene la función principal

Estoy tratando de hacer que una función llame a algún código mientras permito que mi función principal continúe y no tenga que esperar.

Hasta ahora no funciona:

 function doSomething() { return new Promise((resolve, reject) => { if(1) { console.log("doing something"); for(let i = 0; i < 10000; i++) { for(let j = 0; j < 10000; j++) { for(let k = 0; k < 100; k++) { // Do something for a long time to check if async is working } } } console.log("finished doing something"); resolve( {"dummydata": 10} ); } else { reject("error!"); } }) } function main() { doSomething() .then(data => console.log(data)) .catch(err => console.error(err)) console.log("this should print before doSomething() is finished"); } main();

Esta es la salida:

haciendo algo

terminado de hacer algo

esto debería imprimirse antes de que doSomething() termine

{datos ficticios: 10}

¿Por qué mi programa está esperando doSomething()? Quiero que se ejecute en paralelo/asincrónicamente. También intenté hacer de main() una función asíncrona, lo mismo que doSomething(), pero eso no funcionó.

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

JavaScript sigue siendo de un solo subproceso. Si tiene un segmento de código costoso, como su ciclo anidado, y no await dentro del ciclo, todos los demás procesamientos de JavaScript en su entorno se bloquearán mientras el ciclo itera; el flujo de control solo devolverá una vez todo el código síncrono. ha terminado

El código colocado en el nivel superior de la devolución de llamada del constructor de Promise se ejecuta de inmediato; return new Promise no hace que el código se coloque en un subproceso separado, o algo así.

Si bien puede poner en cola la tarea para que comience después de un retraso y permita que el script principal continúe con lo que tenga que hacer:

 function main() { setTimeout(doSomething, 2000); // more code

Para ejecutarlo realmente en paralelo, deberá usar un child_process . Coloque la sección costosa del script en su propio archivo y haga que child_process lo invoque a través .fork .

about 4 years ago · Juan Pablo Isaza Report

0

Puede usar worker_threads: https://nodejs.org/api/worker_threads.html#worker-threads

 const { Worker } = require("worker_threads"); const worker = new Worker( ` const { parentPort } = require('worker_threads'); parentPort.postMessage("doing something"); for (let i = 0; i < 10000; i++) { for (let j = 0; j < 10000; j++) { for (let k = 0; k < 100; k++) { // Do something for a long time to check if async is working } } } parentPort.postMessage("finished doing something"); parentPort.postMessage({ dummydata: 10 }); `, { eval: true } ); worker.on("message", (message) => console.log(message)); console.log("this should print before doSomething() is finished");

Esto es solo un fragmento. Puede intercambiar datos con el trabajador, etc.

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!