Mysql
 sql >> Database >  >> RDS >> Mysql

Node.js esegue un ciclo o un'iterazione in modo sincrono su istruzioni asincrone

Con la ricorsione il codice è abbastanza pulito. Attendi che la risposta http ritorni, quindi esegui il prossimo tentativo. Funzionerà in tutte le versioni di node.

var urls = ['http://stackoverflow.com/', 'http://security.stackexchange.com/', 'http://unix.stackexchange.com/'];

var processItems = function(x){
  if( x < urls.length ) {
    http.get(urls[x], function(res) {

      // add some code here to process the response

      processItems(x+1);
    });
  }
};

processItems(0);

Anche una soluzione che utilizza le promesse funzionerebbe bene ed è più concisa. Ad esempio, se hai una versione di get che restituisce una promessa e Node v7.6+, potresti scrivere una funzione async/await come questo esempio, che utilizza alcune nuove funzionalità di JS.

const urls = ['http://stackoverflow.com/', 'http://security.stackexchange.com/', 'http://unix.stackexchange.com/'];

async function processItems(urls){
  for(const url of urls) {
    const response = await promisifiedHttpGet(url);    
    // add some code here to process the response.
  }
};

processItems(urls);

Nota:entrambi questi esempi ignorano la gestione degli errori, ma probabilmente dovresti averla in un'app di produzione.