2016-07-12 7 views
0

別の問題からデータを取得できません...私は2つの機能を持っている:F1すべてには、forループ

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); 
}, 

はokです。私がconsole.log(free)またはconsole.log(data.rotation)と呼ぶなら、私は望むアレイを手に入れました。

機能2は少し問題があります。データはforループの外側では利用できません。ループ外でconsole.log(data.rot)またはconsole.log(x)と呼ぶと、それは定義されていないと言われているので、ハンドルバーでは手に入れられません。コールバック(NULL、データ)の位置か、for-loopかどうかはわかりません。私はそれだけでは対処できません。

for-loop以外のデータへのアクセス方法、およびこのコードの修正方法を教えてください。

+0

ループ内で非同期リクエストを作成していて、ループ外で返される値にアクセスすることができます.. 'for-loop'は同期ですが、リクエスト'それは内部で作られている...' Promise.all'はあなたを助けることができます.. – Rayon

答えて

0

F2は非同期です。コールバックには、リクエストが返るまで待つ必要があります:

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

ありがとう!それは働いており、理解するのは簡単です。 – BaSic

0

あなたは、ループ内でasynchronous要求を行うと、ループの外返される値であることがにアクセスしています。 for-loopは同期ですが、requestsは内部に作られていません。

Promise.allを使用することができ、

Promise.all(iterable)方法はiterable引数に約束のすべてが解決したときに解決する約束を返す、または拒否する最初に渡さ約束の理由で拒否します。

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

答えをありがとう、しかしArun'sは簡単です。 – BaSic

+0

@ BaSic-喜んでください..それぞれの応答IDの後ろの値をテストするために 'Promise'を使うのが好きです。' loop'からの何らかの要求が失敗した場合に_whatを考えますか?_あなたの 'コールバック 'は決して得られませんと呼ばれる。 'Promise'を使うと' reject 'も処理できます。 – Rayon