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ó.
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 .
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.