2017-07-30 160 views
-3

創建javascript對象並將其轉換爲json後,我的對象未完全轉換。無法將javascript對象轉換爲json

創建javascript對象。

var inputData = { 
    "StartDate": moment(startDate).format('YYYY[-]MM[-]DD'), 
    "EndDate": moment(endDate).format('YYYY[-]MM[-]DD'), 
    "AllRates": [] 
}; 

用從API接收的對象填充數組。

for (var i = 0; i < dates.length; i++) { 
    $.getJSON(
     "http://api.fixer.io/" + dates[i] + "?base=USD", 
     function (data) { 
      inputData.AllRates.push(data); 
     } 
    ); 
} 

我得到一個對象,看起來像這樣: console.log(inputData);

但是,當我轉換一個對象爲JSON由JSON.stringify()我得到一個空數組:

{"StartDate":"2017-07-10","EndDate":"2017-07-13","AllRates":[]} 
+2

可能重複[如何從異步調用返回響應?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-an-asynchronous-call) –

回答

1

你可能會在請求中的數據到達並且您的回調被調用之前將對象轉換爲JSON。你必須保持追蹤有多少響應到達,並在最後一個到達後才轉換爲JSON:

var dateCount = dates.length; 
var finished = 0; 
for(var i = 0; i < dateCount; i++){ 
    $.getJSON("http://api.fixer.io/" + dates[i] + "?base=USD", 
    function(data){ 
     inputData.AllRates.push(data); 
     if(++finished === dateCount){ 
     console.log(JSON.stringify(inputData)); 
     } 
    }); 
} 
+0

在檢索完成後(除了日誌記錄),你仍然想做一些事情,所以我會研究['Promise .all()'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all)^^ – moonwave99

+0

您仍然可以調用自定義回調函數而不是僅僅記錄日誌。如果AJAX函數返回一個Promise(或者如果使用例如取回API),我肯定會使用'Promise.all',但是在那種情況下,我不確定它是否不會通過部分使用promise來變得更復雜。 – Stephan

+0

謝謝,這個解決方案的工作原理) 但是JSON.stringify(inputData)在循環之後被調用,並且來自API的數據在對象內部,這意味着inputData.AllRates.push(data)回調被調用了嗎? –