2013-04-09 12 views
22

Ho un pezzo di codice seguenteNodeJS - rendendo il ciclo while sincrono

var page = 2; 
var last_page = 100; 
while(page <= last_page) { 
    request("http://some_json_server.com/data?page=" + page, function (error, response, body) { 
    if (!error && response.statusCode == 200) { 
     store_data(body) 
    } 
    page++; 
    });     
} 

ho fatto quanto segue, ma non è in realtà il recupero di qualsiasi cosa. Sto facendo questo correttamente?

var page = 2; 
var last_page = 100; 
while(page <= last_page) { 
var async_arr = []; 
async_arr.push(
    function(next) { 
    request("http://some_api_url?page=" + page, function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
     store_data(body); 
     } 
    }); 
    } 
); 

async.series(
    async_arr, done 
); 
+0

https://github.com/caolan/async#series – UpTheCreek

+2

Per quanto riguarda la modifica, è necessario chiamare il prossimo() nella richiamata richiesta –

risposta

21

Siete alla ricerca di async.whilst(). Questa soluzione presuppone che tu voglia effettivamente fare ogni richiesta dopo l'altra. Come @UpTheCreek menziona (modifica: il commento a cui ho fatto riferimento è stato modificato) sarebbe probabilmente possibile farlo in modo asincrono e tenere traccia di ogni risultato usando async.parallel.

var page = 2, 
    lastPage = 100; 

async.whilst(function() { 
    return page <= lastPage; 
}, 
function (next) { 
    request("http://some_json_server.com/data?page=" + page, function (error, response, body) { 
    if (!error && response.statusCode == 200) { 
     store_data(body) 
    } 
    page++; 
    next(); 
    }); 
}, 
function (err) { 
    // All things are done! 
}); 
+0

ha funzionato bene. Grazie. – ericbae

+0

Dannazione, vorrei aver risposto alla mia domanda che ho appena chiesto. Penso che questo sia esattamente quello che sto cercando. – theGrayFox

52

Con while si ottiene un ciclo occupato, che è contro-scopo nel nodo.

Rendilo invece una funzione ricorsiva. Ogni chiamata verrà eseguita in un segno di spunta separato.

var page = 2; 
var last_page = 100; 

(function loop() { 
    if (page <= last_page) { 
     request("/data?page=" + page, function (error, response, body) { 
      if (!error && response.statusCode == 200) { 
       store_data(body) 
      } 
      page++; 
      loop(); 
     }); 
    } 
}()); 
+0

Grazie, @GabrielLlamas! – katspaugh

+0

+1 E se non conoscessi il numero di pagine? Come gestiresti questo @katspaugh – theGrayFox

+0

@ TheGrayFox, la risposta dovrebbe in qualche modo indicare il numero di pagine, o semplicemente non inviarti nessun dato in modo da sapere che non dovresti fare la prossima richiesta. – katspaugh