2017-07-17 86 views
0

我在設置變量時遇到問題,或者至少在異步瀑布中返回它。我知道你不能以異步方式返回,但是我對我的變量jsonFinal做了回調,它進入了下面的數據下的函數。如何設置變量異步瀑布?

function getIndividualMatchJSONObjHelper(matchData, matchParticipantData, indexIter) { 
var individualMatchURL = 'https://na1.api.riotgames.com/lol/match/v3/matches/' + matchData.matchID[indexIter] + '?api_key=' + API_KEY; 
var jsonFinal; 
async.waterfall([ 
    function(callback) { 
      request(individualMatchURL, function(err, response, body) { 
      if(!err && response.statusCode == 200) { 
       var json = JSON.parse(body); 
       for (var j = 0; j < 10; j++) { 
        if (matchData.championID[indexIter] == json['participants'][j].championId) { 
         jsonFinal = json['participants'][j]; 
         callback(null, jsonFinal); 
        } 
       } 
      } 
      else { 
       console.log(err); 
       } 
     }); 
    } 
], 
function(err, data) { 
    if(err) { 
     console.log(err); 
    } 
    else { 
     jsonFinal = data; 
    } 
}); 
console.log(jsonFinal); 
return jsonFinal; 
} 

我該如何獲得正確返回jsonFinal的函數?

回答

1

您只能像使用任何異步操作一樣獲取回調中的變量。因此,修改你的函數以接受回調。

function getIndividualMatchJSONObjHelper(matchData, matchParticipantData, indexIter, callback) { 
    var individualMatchURL = 'https://na1.api.riotgames.com/lol/match/v3/matches/' + matchData.matchID[indexIter] + '?api_key=' + API_KEY; 
    async.waterfall([ 
     function (callback) { 
      request(individualMatchURL, function (err, response, body) { 
       // always trigger the callback even when you have errors or else your program will hang 
       if (err) 
        return callback(err); 
       if (response.statusCode != 200) 
        return callback(new Error('Status code was ' + response.statusCode)); 

       var json = JSON.parse(body); 
       for (var j = 0; j < 10; j++) { 
        if (matchData.championID[indexIter] == json['participants'][j].championId) { 
         // match found: send back data 
         console.log('inside', json['participants'][j]); 
         return callback(null, json['participants'][j]); 
        } 
       } 
       // if it reaches this point, no match was found 
       callback(); 
      }); 
     } 
    ], callback); // note: this outer 'callback' is NOT the same as the inner 'callback' 
} 

然後,當你如調用你的函數

getIndividualMatchJSONObjHelper(data, participants, indexIter, function (err, json) { 
    // you can only get the JSON at this point 
    console.log('outside', json); 
    matchParticipantData.specificParticipantData[i] = json; 
}); 
+0

感謝您的回覆。但問題是,當我將它存儲到一個變量中時,打印出來時我仍然未定義。你確定它回來了嗎?這裏是如何存儲變量: 'matchParticipantData.specificParticipantData [i] = getIndividualMatchJSONObjHelper(matchData,matchParticipantData,i,function(err,json){});' –

+0

再次*您只能獲取回調中的變量與任何異步操作*。你的函數不會返回任何東西,但它提供了一個回調函數,當它的異步操作完成時,它有一個參數'json'。檢查了它。 – Mikey

+0

非常感謝!你幫助我更好地理解回調。但我只關心一件事。我注意到打印對象 'matchParticipantData.specificParticipantData [i]'不包含函數後面的json。我用一個變量在函數中進行了測試,但沒有在其外部進行測試。是否有一個原因?當json被設置時,我需要它在函數的外部 –