两个语句执行之间所需的延迟

Delay required in between the execution of two statements

本文关键字:之间 延迟 执行 语句 两个      更新时间:2023-09-26

我正在使用extjs 4.2,在一个地方我正在加载这样的存储对象:

var  userDetailStore = Ext.create('Ext.data.Store', {
    model : 'Person.DetailsModel',
    autoLoad : true,
    proxy : {
        type : 'ajax',
        method : 'POST',
        url : 'getValueAction.action',
        reader : {
            type : 'json',
            root : 'details'
        },
        writer : {
            type : 'json',
            root : 'details'
        }
    },
    fields : ['id','loginName','referenceId' ,'name']
});//Here I load the store which will definitely contain a list of values.

在下一行中,我想从像这样的存储对象中获得第一个值的referenceId

var empId =  userDetailStore.getAt(0).get('referenceId')

和我得到的错误,因为直到现在的getCount()的存储对象userDetailStore给我零。但是,如果我写一个警报语句,如alert('loading data');在我获得referenceId的行之前,代码工作得很好。userDetailStore.getCount()这行给了我确切的值。

所以我认为在加载商店和使用商店之间需要某种延迟,但我不想显示警告。我甚至使用了sleep()方法来代替alert语句。但这也行不通。(顺便说一句,我甚至不想通过执行sleep())

来冻结浏览器

我在加载商店时做错了什么吗?是否有任何一般的方法让我在商店完全加载后执行使用商店的代码?

谁来帮帮我…

问候:Dev

Vijay的回答是正确的,但我想我应该扩展一下这个概念,以便清楚地了解这个答案如何适合您正在做的事情。

重要的是要理解,当您发出AJAX请求时,请求是异步的。这实际上意味着(正如您所发现的)调用脚本的其余部分不等待异步进程完成。相反,在您发出异步请求的那一刻,您的脚本将继续它的快乐方式,执行下一行代码。

如果你仔细想想,这就解释了为什么你没有在商店里看到"计数"。当你的异步请求是在到服务器的过程中,得到结果,然后返回到你的请求,你的代码的其余部分保持正确的执行,忘记了在异步请求中发生了什么(这正是为什么异步请求是强大的和了不起的)。

这也是为什么添加警报似乎"解决"你的问题。当调用alert()时,实际上是在发出警报时停止脚本的执行。但是,由于对数据的请求是异步的,因此单击警报的"OK"按钮所花费的时间(并因此恢复脚本的处理)使异步请求有足够的时间完成其生命周期并更新原始调用对象。

鉴于此,可以理解为什么"延迟"似乎是一种可取的方式,因为警报的"延迟"(或者实际上是"停止")修复了您的问题(至少在表面上)。然而,对于异步请求,您永远无法真正知道需要多长时间才能完成。如果你有很大的响应,或者有不寻常的网络延迟,或者任何其他问题……硬编码的延迟可能有效,但也可能无效。最令人恼火的是,你永远不会得到一致的结果,并且会不断地增加"延迟",以适应所有可能导致异步请求花费越来越长时间的事情。

这就是为什么store的load()事件(以及回调一般情况下)是理解和实现如此关键的概念的原因。通过监听load()事件,然后在事件触发的上下文中执行所需的代码,您可以确定地知道存储对数据的异步请求已经完成。

如果你以前没有使用过回调和事件处理,为了打破线性,过程思维模式,它确实需要一点时间来习惯。但是,在处理AJAX请求时,特别是处理像ExtJS 4这样的事件驱动框架时,为了构建有效和一致的应用程序,您需要接受这个概念。

使用on load事件获取完全加载后的计数

userDetailStore.on('load', function(){
                alert("Fully loaded");
            });

这里设置autoload为false,在某些操作上你可以使用load()来加载你的store。

store.load({
    callback: function(records, operation, success) {
        // do something after the load finishes
    },
    scope: this
});