2016-07-12 6 views
0

Ein weiteres Problem ... Ich habe 2 Funktionen:Daten können nicht aus for-Schleife

function(data, callback){    //F1 
      var URL = 'url'; 
      request(URL, function(err, response, body) { 
       if(response.statusCode == 200){ 
        var json = JSON.parse(body); 
        var chid = []; 
         for(var i = 0; i < json['champions'].length;i++){ 
         chid.push(json['champions'][i].id); 
        } 
        data.rotation = chid; 
        free = chid; 
        callback(null, data); 
      } 

     }); 
    }, 
function(data, callback) {  //f2 
    for (var r=0; r<10; r++){ 
     var URL = 'url'; 
     request(URL,function(err, response, body) { 
      if(response.statusCode == 200){ 
       var json = JSON.parse(body); 

       x.push(json.name); 
       data.rot = x; 
      } 
     }) 
    } 
    callback(null, data); 
}, 

Mit F1 alles in Ordnung ist. Wenn ich console.log(free) oder console.log(data.rotation) rufe, habe ich das Array, das ich will.

Funktion 2 ist ein bisschen problematisch. Daten sind außerhalb der for-Schleife nicht verfügbar. Wenn ich console.log(data.rot) oder console.log(x) außerhalb der Schleife anrufe, sagt es, dass es undefined ist, also kann ich es nicht mit Lenkstangen bekommen. Ich habe keine Ahnung, ob es um die Rückrufposition (null, Daten) oder um die for-Schleife geht. Ich kann das nicht alleine bewältigen.

Wie erhalten Sie Zugriff auf Daten außerhalb der for-Schleife, und wie Sie diesen Code beheben?

+0

Sie machen 'asynchronous' Anforderungen in einer Schleife und den Zugriff auf _to BE_ zurückgegebenen Werte außerhalb der Schleife ..' for-loop' ist synchron, aber 'Anfragen 'gemacht werden drinnen sind nicht ...' Promise.all' könnte dir helfen .. – Rayon

Antwort

0

F2 ist Async. So zum Rückruf Sie, bis die Anfragen warten müssen zurückgibt:

function(data, callback) {  //f2 
    for (var r=0, dataRx=0; r<10; r++){ 
     var URL = 'url'; 
     request(URL,function(err, response, body) { 
      if(response.statusCode == 200){ 
       var json = JSON.parse(body); 

       x.push(json.name); 
       data.rot = x; 
      } 
      dataRx++; 
      if(dataRx === 10) callback(null, data); 
     }) 
    } 

}, 
+0

Danke! Es funktioniert und es ist einfach zu verstehen. – BaSic

0

Sie machen asynchronous Anfragen in einer Schleife und den Zugriff auf zurückgegebenen Werte außerhalb der Schleife zu sein. for-loop ist synchron, aber requests gemacht werden nicht drin.

Promise.all verwendet, könnte

Die Promise.all(iterable) Methode gibt ein Versprechen, dass, wenn alle den Versprechungen im iterable Argument löst haben beschlossen, oder lehnt sie ab mit der Begründung des ersten Versprechen übergeben, die ablehnt.

function abc(data, callback) { 
 
    var arr = []; 
 
    for (var r = 0; r < 10; r++) { 
 
    var URL = 'url'; 
 
    var req = request(URL, function(err, response, body) { 
 
     if (response.statusCode == 200) { 
 
     var json = JSON.parse(body); 
 

 
     x.push(json.name); 
 
     data.rot = x; 
 
     } 
 
    }); 
 
    arr.push(req); 
 
    } 
 
    Promise.all(arr).then(function SuccessHandler(arrayOfResults) { 
 
    callback(null, arrayOfResults); 
 
    }, function ErrorHandler(reason) { 
 
    console.log(reason) 
 
    }); 
 
}

+0

Vielen Dank für die Antwort, aber Arun ist einfacher. – BaSic

+0

@ BaSic-Pleasure .. Ich bevorzuge 'Promise' als Test der Wert von nach jeder Antwort ID' Bad' Idee .. Beachten Sie auch, dass _What, wenn einige Anfrage von 'loop' scheitert? _ Ihre' Callback' wird nie bekommen namens. Mit 'Promise' können Sie' reject' auch behandeln. – Rayon