2016-11-03 3 views
-1

Wegen asynchroner Anforderung „Register“ ist leerRückruf return null wegen Asynchron-Anfrage NodeJS

ich versuche, einen Weg zu finden, einen Rückruf (tab) mit einer Lasche nicht leer

function getUserEvents(callback){ 

    var tab = []; 
    for(var i=0; i<100 ;i++){ //page system 

    request("mysite/list?page="+i, function (err, res, body) { 
     if (!err && res.statusCode == 200) { 

     tab.push(JSON.parse(body)); 

     } 
    }); 

    } 
    callback(tab); 
} 

Antwort

0

Dieses zurückzukehren ist echt knifflig: Sie müssen verfolgen, wie viele Antworten Sie haben, und Callback (Tab) nur aufrufen, wenn Sie sie alle haben. Es ist die eigentliche Buchhaltungsarbeit zu tun.

Bibliotheken wie async haben Funktionen dafür - zum Beispiel eine asynchrone Schleife. Sie können es von Hand tun, aber ihr Weg wird getestet.

0

Regelmäßige For-Schleife funktioniert nicht für Async-Aufruf so. Sie müssen etwas verwenden, z. B. async.whilst(), mit dem Sie den Ablauf des async request() -Aufrufs steuern können. Hier ist der überarbeitete Code (nicht vergessen Asynchron-Modul zu installieren):

var async = require('async'); 
function getUserEvents(callback){ 
    var tab = []; 
    var i = 0; 

    async.whilst(
    function() { return i < 100; }, 
    function(cb) { 
     request("mysite/list?page="+i, function (err, res, body) { 
     if (!err && res.statusCode == 200) { 
      tab.push(JSON.parse(body)); 
     } 
     i++; 
     cb(); 
     }); 
    }, 
    function (err) { 
     // finish processing pages 0-99 
     callback(tab) 
    } 
); 
} 
+1

danke Es funktioniert – Rayan