请 bare 与我同在,我对Javascript很新。我拉着我的头发想弄清楚为什么这不起作用。请记住,我来自Java背景。我有一个功能' getCsvData'我本质上试图解析CSV文件并动态地将对象属性添加到数据源对象然后返回它。正如您所看到的,在函数getCsvData'之外,我尝试在调用我的函数后记录结果,但结果对象为空,并且没有添加任何对象特性。
我有一种非常强烈的感觉,它必须通过关闭/范围链分辨率,我仍然在努力学习和理解。
问题是:为什么没有动态添加到数据源对象的属性?我相信它们实际上被添加到匿名函数'函数(数据)'的范围内。作为第二个参数传递给' $。get',但是一旦外部函数“getCsvData'回报。为什么,我该如何解决这个问题?谢谢!
<script src="js/jquery-1.10.2.min.js"></script>
<script src="js/knockout-3.0.0.js"></script>
<script src="js/globalize.min.js"></script>
<script src="js/dx.chartjs.js"></script>
<script src="js/jquery.parse.js"></script>
$(function () {
function getCsvData(fileName, groupBy, year) {
var datasource = { }
$.get(fileName, function(data) {
var alldata = $.parse(data, { header: true });
for (var i = 0; i<alldata.results.rows.length;i++) {
var key = alldata.results.rows[i][groupBy]
if (key in datasource) {
datasource[key] = datasource[key] + 1
} else {
datasource[key] = 0
}
}
});
return datasource;
};
var results = getCsvData("data/data.csv", "Priority", 2012);
console.log(results)
for (key in results) {
console.log(key)
}
});
答案 0 :(得分:2)
这是因为get
被称为异步,因此datasource
是启动get
之后的返回值,而不是在收到结果之后(即它是空的,因为get
还没有调用完成)。您应该使用回调来指示完成情况,或者使用带有jQuery.ajax()
选项的sync
等待get
的响应,然后再从getCsvData
返回。见here。