2017-07-30 176 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)回调被调用了吗? –