动态添加的对象属性未在Javascript中添加

时间:2014-04-14 23:34:55

标签: javascript jquery asynchronous closures scope-chain

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

1 个答案:

答案 0 :(得分:2)

这是因为get被称为异步,因此datasource是启动get之后的返回值,而不是在收到结果之后(即它是空的,因为get还没有调用完成)。您应该使用回调来指示完成情况,或者使用带有jQuery.ajax()选项的sync等待get的响应,然后再从getCsvData返回。见here