nodo.js problema asincrono?

Fondamentalmente voglio passare attraverso gli arbitri esistenti per ottenere ogni simbolo

Quindi leggi il contenuto all’interno di ciascun URL di simbolo e salva il contenuto nella directory locale.

In PHP, stamperà ogni ticker e ogni simbolo in un passo alla volta.

Ma nel nodo, le sequenze sono rovinate.

per prima cosa stamperà tutte le url_optionable …

a volte stampa console.log (‘percorso:’ + file), a volte stampa console.log (“Il file è stato salvato!”);

Ogni volta che si esegue la funzione fs.writefile, il valore sym non viene rilevato, il file salvato viene visualizzato come msn-.html

for(var v=0;v<arrtickers.length;v++) { var arrticker= arrtickers[v].split('@@'); var sym= $.trim(arrticker[1]); url_optionable= "http://sample.com/ns/?symbol="+sym; console.log('url_optionable: ' + url_optionable); request({ uri:url_optionable }, function (error, response, body) { if (error && response.statusCode !== 200) { console.log('Error contacting ' + url_optionable) } jsdom.env({ html: body, scripts: [ jqlib ] }, function (err, window) { var $ = window.jQuery; var data= $('body').html(); var file= "msn-"+sym+".html"; console.log('path: ' + file); fs.writeFile(file, data, function(err) { if(err) { console.log(err); } else { console.log("The file was saved!"); } }); }); }); } 

ZeissS ha ragione. In sostanza, non è ansible utilizzare le variabili dichiarate all’interno del ciclo for in una funzione di callback a una chiamata asincrona, poiché verranno tutte impostate sull’ultimo valore nel ciclo. Quindi nel tuo codice, url_optionable e sym corrisponderanno agli arrtickers[arrtickers.length - 1] .

O utilizzare (come suggerisce ZeissS):

 arrtickers.forEach(function(arrticker) { // Get symbol and url, make request etc }); 

Oppure dichiara una funzione che accetta sym e fa la richiesta e chiama nel tuo loop:

 function getSymbol(symbol) { // Request url and read DOM } for(var v=0;v 

Personalmente, forEach per la soluzione forEach .