javascript Ext.Ajax.request中的范围问题

时间:2011-09-17 22:12:01

标签: javascript extjs scope extjs4

我有这个类从服务器自动生成JSON存储。商店是动态创建的,可以在Firebug的DOM中查看。 我想我有一些范围问题。当我想在Ext.Ajax.request的回调函数中调用console.log(Ext.getStore('AdminSettings'))(其中AdminSettings是创建的商店之一)时,'AdminSettings'商店返回,但如果我把console.log(Ext.getStore('AdminSettings'))放在回调函数外的任何地方,我在firebug中得到未定义的消息,我的商店没有实例化。 请参阅代码注释以查看其实际操作。

Ext.Ajax.request({
url : './account/getadminstores',
callback : function(options, success, response) {
var json = Ext.decode(response.responseText);
var adminStores = new Array();
// setup and intitialize on the fly stores
for ( var key1 in json) {
var storeFields = new Array();
for ( var key2 in json[key1]) {// if (i==1){break;}
for ( var key3 in json[key1][key2]) {
storeFields.push(key3);}
break;};
Ext.define('MA.store.' + key1, {
extend : 'Ext.data.Store',
fields : storeFields,
storeId : key1,
data : json[key1]
});
Ext.create('MA.store.'+key1);};
console.log(Ext.getStore('AdminSettings'));
//returns MA.store.AdminSettings in firebug and everything is fine 
                }
            });//eof Ext.Ajax.request
            console.log(Ext.getStore('AdminSettings'));
//returns undefined which is strange

2 个答案:

答案 0 :(得分:1)

Ext.Ajax.request是异步的。您的最终console.log调用什么都不返回,因为在执行它时请求尚未完成。取决于请求回调结果的任何代码也需要由回调执行。

答案 1 :(得分:1)

这是由于javascript的异步性质,callback直到ajax请求完成后才被调用,因此Ext数据存储也没有被定义。

脚本的执行顺序是:

  1. 初始化Ajax请求
  2. 执行console.log(由于数据存储尚未定义,因此未定义)
  3. javascript正在等待./account/getadminstores
  4. 的ajax响应
  5. 响应进来,调用回调函数(定义数据存储)