Come faccio a rendere questa funzione JS asincrona?

function takesTime(){ for (var i = 0; i<some_very_large_number; i++){ //do something synchronous } console.log('a'); } takesTime(); console.log('b'); 

Questo stampa: a b Come vuoi stamparlo: b a

Vedo che questo è codificato node.js, quindi risponderò da quella prospettiva: non dovresti. Di solito, se stai bloccando, sarà: legato alla rete (dovresti usare e / o riutilizzare le librerie di rete attorno ai metodi asincroni), legato agli I / O (dovresti usare e / o riutilizzare le librerie di I / O ) o legato alla CPU. Non hai fornito alcun contesto per quello che è l’attività di lunga durata, e dato che hai un ciclo invariante che contiene un some_very_large_number , presumo che tu stia immaginando un compito che some_very_large_number molta CPU su un campo più ampio.

Se sei effettivamente legato alla CPU, dovresti riconsiderare la tua strategia. Il nodo vive solo su un core, quindi anche se si fosse in grado di utilizzare il multithreading, si sarebbero davvero ruotate le ruote, poiché ogni richiesta avrebbe comunque richiesto una certa quantità di tempo CPU. Se intendi davvero fare qualcosa di intensivo da un punto di vista computazionale, potresti voler utilizzare un sistema di accodamento e avere qualcos’altro che elabora i dati che sono meglio progettati per crunching.

 for (var i = 0; i < someVeryLargeNumber; ++i) { setTimeout(function () { //do something synchronous }, 0); } 

Vedi anche setZeroTimeout per guadagnare qualche millisecondo per ciclo, anche se il personale che ci sta lavorando sembra essere basato su browser.

Javascript è basato su eventi e tutto avviene in un singolo thread. Il modo per renderlo “asincrono” è usare un timeout (setTimeout ()).

Puoi utilizzare i web worker per raggiungere il tuo objective, ma avrai bisogno di un file js separato, e dovrai aggiungere il codice idraulico per postare messaggi e gestire tali messaggi.

node.js non supporta i web worker in modo nativo, ma un’implementazione è disponibile all’indirizzo:

https://github.com/cramforce/node-worker/

Altrimenti, è simile al seguente codice:

 var pid = require ('child_process'). spawn ('node', ['childScript.js'])
 pid.stdout.on ('data', function (data) {
   console.log (dati);
 });
 console.log ( 'b');

childScript.js

 for (var i = 0; i