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

标签 javascript jquery asynchronous closures scope-chain

bare 耐心等待,我是 Javascript 的新手。我正在拔头发试图弄清楚为什么这行不通。请记住,我来自 Java 背景。我有一个函数“getCsvData”,我实际上是在尝试解析 CSV 文件并将对象属性动态添加到数据源对象,然后返回它。如您所见,在函数“getCsvData”之外,我尝试在调用我的函数后记录结果,但结果对象为空,并且没有添加任何对象属性。

我有一种强烈的感觉,它必须归因于我仍在努力学习和理解的闭包/作用域链解析。

问题是:为什么不将属性动态添加到数据源对象?我相信它们实际上被添加到作为第二个参数传递给“$.get”的匿名函数“function(data)”的范围内,但是一旦外部函数“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)
    }
});

最佳答案

这是因为get调用的是async,所以datasource是发起get后的返回值,而不是收到结果后(即它是空的,因为尚未调用 get 完成)。您应该使用回调来指示完成,或者使用带有 sync 选项的 jQuery.ajax() 以在返回之前等待对 get 的响应来自 getCsvData。参见 here .

关于javascript - 动态添加的对象属性未在 Javascript 中添加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23072206/

相关文章:

javascript - 像 facebook 聊天一样的窗口

jquery - 根据 php session 变量生成 jquery 上下文菜单项?

javascript - 如何在 async.each 内具有 async.waterfall 的外部函数中调用 async.each

javascript - appendChild() 不接受传递的字符串参数作为参数?

Javascript Handsontable - 未捕获的类型错误 : Cannot read property 'insertBefore' of undefined

jquery - 如何通过 jQuery 强制应用 CSS 过渡效果/动画

c# - 堆叠和延迟多个 UI 更改通知

dart - 为什么我们必须在使用 Isolates 后使用 exit(0) 从 main 退出?

javascript - 如何获取输入字段中的最后一个字符/数字?

javascript - javascript 中的 .all 或 Jquery 中的 .all 替代品是什么