【问题标题】:Dynamically added object properties not being added in JavascriptJavascript 中未添加动态添加的对象属性
【发布时间】:2014-05-29 03:04:18
【问题描述】:

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

【问题讨论】:

  • 又一个“为什么我的异步函数没有立即更新?”题。 ;-)
  • @RobG,实际上我完全忘记了 $.get 在默认情况下是异步的,如果我早点意识到这一点,它会让这变得容易得多!谢谢!
  • 没关系,你是数以百万计的人中的一员,他们说“doh!!”到那个。 :-)

标签: javascript jquery asynchronous closures scope-chain


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-08-26
    • 1970-01-01
    • 2015-12-12
    • 2019-11-14
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    相关资源
    最近更新 更多