【问题标题】:Object scope. Why does this give a null object [duplicate]对象范围。为什么这会给出一个空对象[重复]
【发布时间】:2013-05-15 10:33:50
【问题描述】:
initialize: function() {
    var store = {};
    var item = {};
    var me = this;

    Ext.Ajax.request({
        url: "some_valid_url",
        success: function(response) {
            try {
                var parser = new DOMParser();
                var xml = parser.parseFromString(response.responseText, "text/xml");

                store = Ext.create('Ext.data.Store', {
                    autoLoad: true,
                    fields: ['temp', 'low', 'high', 'desc', 'icon'],
                    data: xml,
                    proxy: {
                        type: 'memory',
                        reader: {
                            type: 'xml',
                            rootProperty: 'current',
                            record: 'day'
                        }
                    }
                });
                item = Ext.create("Ext.Container", {
                    var bla = "hello world",
                })
            } catch (err) {
                //err
            }
        }
    });
}

console.log("STORE AND ITEM");
console.log(item);
console.log(store);

为什么itemstore 还给null 对象?

但是我可以看到它正在解析一些数据,就好像我将 console.log 放在 storeitem 元素之间我会得到一个有效的元素。

STORE AND ITEM 
Object {} ArticleWeatherList.js:105
Object {} ArticleWeatherList.js:106

【问题讨论】:

  • 所以我需要ajax 请求之外的这些项目
  • 特别是在这种情况下,您需要重构异步逻辑:根据整体情况,一种解决方案是在 AJAX 调用完成时运行的初始化函数中添加回调函数.

标签: javascript oop scope


【解决方案1】:

Ajax 是异步的,这基本上意味着代码继续执行而不等待请求完成。因此,当您尝试使用 item 和 store 时,请求尚未完成,设置它们的成功方法尚未运行。解决这个问题的唯一方法是强制请求同步发生(尽管这通常是一个坏主意)或将所有依赖于请求的代码放入成功回调或从成功回调中调用的函数中。

【讨论】:

    【解决方案2】:

    因为, 您已将 storeitem 声明为 intialize 函数内的局部变量。如果你想访问这些变量,你必须在全局而不是在函数中声明它们。在变量声明中省略 var 关键字也可以达到同样的效果。

    initialize: function () {
            store = {};
            item = {};
            var me = this;
            ....
    

    这应该可行,但被认为是一种不好的做法。

    【讨论】:

    • console.log() 调用也在同一个函数中。
    • 抱歉,我没有意识到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 2016-03-17
    • 2013-07-04
    • 2013-05-27
    • 2011-02-03
    • 2018-06-28
    • 2012-03-02
    相关资源
    最近更新 更多