Javascript 在AJAX在ExtJS中结束之前展开树节点

Javascript 在AJAX在ExtJS中结束之前展开树节点,javascript,ajax,extjs,tree,extjs4,Javascript,Ajax,Extjs,Tree,Extjs4,我有一个搜索栏停靠在我的树面板上。当我写东西并按enter键时,一个Ajax请求触发并返回将树扩展到所请求的文件夹点所需的文件夹ID。在ajax.request的成功配置中,我使用循环通过getNodeById调用每个节点的expand函数。但是,在第一次扩展之后,ExtJS会从代理中发出一个ajax请求来获取文件夹数据(因为它还没有被加载)。由于AJAX是异步的,因此循环比服务器响应快,并且在加载节点之前尝试调用节点的.expand()函数,并给出未定义的错误。我应该如何处理这个问题?我知道,

我有一个搜索栏停靠在我的树面板上。当我写东西并按enter键时,一个Ajax请求触发并返回将树扩展到所请求的文件夹点所需的文件夹ID。在ajax.request的成功配置中,我使用循环通过getNodeById调用每个节点的expand函数。但是,在第一次扩展之后,ExtJS会从代理中发出一个ajax请求来获取文件夹数据(因为它还没有被加载)。由于AJAX是异步的,因此循环比服务器响应快,并且在加载节点之前尝试调用节点的.expand()函数,并给出未定义的错误。我应该如何处理这个问题?我知道,一般来说,在AJAX中,在处理请求之后,您必须对想要运行的所有内容使用回调函数,但我不确定在这种情况下如何做到这一点

Ext.define('treeStore', 
{
    extend : 'Ext.data.TreeStore',
    alias: 'widget.treeStore',
    autoLoad : false,
    model : 'treeModel',
    root :  {
        id: 0,
        name : 'Root', 
        expanded : true,
        loaded: true
    },
    proxy :  {
        type : 'ajax', 
        url : 'MyServlet', 
        reader :  {
            type : 'json', 
            root : 'children'
        }
    },
    folderSort: true
});

Ext.define('Ext.tree.Panel',{
.
.
.
//Stuff about the tree panel etc.
dockedItems: {
        xtype: 'textfield',
        name: 'Search',
        allowBlank: true,
        enableKeys: true,
        listeners: { 
            specialkey: function (txtField, e) { 
                if (e.getKey() == e.ENTER){
                    var searchValue = txtField.getValue();
                    Ext.Ajax.request({
                        url: 'MyServlet',
                        params: {
                            caseType: 'search',
                            value: searchValue
                        },
                        success: function(response) { //ATTENTION: When calling the .expand() the AJAX hasn't finished and cannot find the node.
                            response = Ext.decode(response.responseText);
                            var panel = txtField.up();
                            response.IDs.forEach(function(entry){
                                panel.getStore().getNodeById(entry.folderId).expand(); <-problem here
                            });
                        }
                    });
                }
            }
        }
    }
Ext.define('treeStore',
{
扩展:“Ext.data.TreeStore”,
别名:“widget.treeStore”,
自动加载:false,
模型:“树模型”,
根目录:{
id:0,
名称:'根',
对,,
加载:正确
},
代理:{
键入:“ajax”,
url:'MyServlet',
读者:{
键入:“json”,
根:“儿童”
}
},
folderSort:对
});
Ext.define('Ext.tree.Panel'{
.
.
.
//关于树面板的东西等等。
摘要:{
xtype:'textfield',
名称:'搜索',
allowBlank:是的,
使能键:正确,
听众:{
特殊键:函数(txtField,e){
如果(e.getKey()==e.ENTER){
var searchValue=txtField.getValue();
Ext.Ajax.request({
url:'MyServlet',
参数:{
案例类型:“搜索”,
值:searchValue
},
成功:函数(响应){//注意:调用.expand()时,AJAX尚未完成,无法找到节点。
response=Ext.decode(response.responseText);
var panel=txtField.up();
response.IDs.forEach(函数(条目){

panel.getStore().getNodeById(entry.folderId).expand();通常在编写Ext应用程序时,我发现即使事情应该按顺序启动,有时在AJAX调用后立即调用某些东西有时速度太快。可能树节点还没有正确渲染,或者存在其他问题

尝试围绕该代码包装延迟的任务:

new Ext.util.DelayedTask(function()
{
    response = Ext.decode(response.responseText);
    var panel = txtField.up();
    response.IDs.forEach(function(entry){
        panel.getStore().getNodeById(entry.folderId).expand(); <-problem here
    });
}, this).delay(100);
new Ext.util.DelayedTask(函数()
{
response=Ext.decode(response.responseText);
var panel=txtField.up();
response.IDs.forEach(函数(条目){

panel.getStore().getNodeById(entry.folderId).expand();我发现expand()函数本身有一个回调函数。我正在试图找到正确的方法来利用它。有什么想法吗?它不能解决问题。我尝试了setTimer方法,但这不是所需要的。setTimer在内部执行函数之前等待X个时间量,但程序本身不等待。我想要的是程序停止m向前移动,等待AJAX响应加载文件夹树数据,然后继续。setTimer不会停止程序运行,它会继续运行,只是在X秒后启动该函数。这对我没有帮助,因为如果文件夹数据尚未加载,则无处可去。