2016-07-11 49 views
0

另一個問題......我有2個功能:如何減慢代碼?

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

隨着F1一切正常。如果我撥打console.log(free)console.log(data.rotation)我得到了我想要的數組。

功能2有點問題。數據不可用於for循環之外。如果我在循環外調用console.log(data.rot)console.log(x),它表示它是未定義的,所以我無法使用手柄。我不知道這是關於callback(null, data)位置還是關於for-loop。我無法單獨處理它。

如何訪問for循環之外的數據?可能回調被稱爲比所有請求都快。如何減慢速度並使其工作?

+5

這是一個異步API。 – Pointy

+0

請參閱[這個答案](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call/14220323#14220323) – peteb

回答

0

上面定義了X.此代碼運行良好。

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

},

1

爲了讓Pointy在評論中說的內容更加清晰,當for循環執行請求時,內部函數在數據返回時調用。 for循環將完成,然後觸發回調,無論異步請求中的數據是否已返回,所以在調用回調之前數據很可能不會返回。換句話說,這是一種幾乎總是失敗的競爭狀態。

+0

那麼如何更改代碼使它工作?我並不擅長這一點,它花了我幾個小時來建立起來(並且功能2不能正常工作) – BaSic

+0

請求是否有一個可以使它同步的參數? – nixkuroi