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

Ext.Ajax.request中的javascript范围问题,javascript,extjs,scope,extjs4,Javascript,Extjs,Scope,Extjs4,我有一个从服务器自动生成JSON存储的类。存储是动态创建的,可以在Firebug的DOM中查看。 我想我有一些作用域问题。当我想在Ext.Ajax.request的回调函数中console.log(Ext.getStore('AdminSettings'))(其中AdminSettings是创建的存储之一)时,会返回'AdminSettings'存储,但如果我将console.log(Ext.getStore('AdminSettings')放在回调函数之外的任何地方,我在firebug中收到未

我有一个从服务器自动生成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

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

这是由于javascript的异步性质,
回调在ajax请求完成后才会被调用,因此也不会定义Ext数据存储

脚本的执行顺序为:

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

  • 我给你介绍了异步的东西。你能提供一个解决方案吗?我应该使用同步调用吗?这样的东西存在吗?我有一个视口和一个网格,如果没有,我将在页面加载时立即需要存储。网格的存储将是未定义的。将网格的初始化代码封装在一个可以从Ext.Ajax.request调用的函数中回拨。在网格准备就绪之前,您可能需要使用卡片布局等作为占位符。也就是说,如果您的页面如此依赖于请求的结果,那么您最好将数据作为页面本身的一部分交付给客户端,以便可以立即使用。关于如何在ajax请求完成之前暂停呈现小部件的解决方案?