两个语句执行之间所需的延迟
Delay required in between the execution of two statements
我正在使用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
});
- 关键帧之间的css3动画延迟
- JavaScript/jQuery-添加添加和删除类与下一个函数之间的延迟
- jquery .each 循环来执行每个数组项,它们之间有延迟
- AJAX 调用和表单提交之间的延迟
- foreach循环每次迭代之间的延迟
- 在javascript for循环的迭代之间应用延迟
- 如何在JavaScript中测量交互和mousedown事件之间的延迟
- 在Raphael JS中,不透明度:0和开始动画到不透明度:1之间的延迟
- 使用setTimeout在创建新元素之间强制延迟
- Javascript 或 angularjs 在刷新之间延迟浏览器关闭或选项卡关闭
- Javascript - 循环 3 个函数,每个函数之间有延迟
- 在操作之间发送 Ajax 消息集超时 m 延迟
- 在“for”循环迭代之间添加延迟
- 多边形的创建和显示之间的延迟
- 在jQuery的每次迭代之间应用延迟's.each()方法
- jQuery在列表中添加remove类,两者之间有延迟
- JavaScript/CSS:向DOM添加元素和应用其CSS规则之间的延迟
- JavaScript循环迭代中的POST之间需要延迟
- 为什么我的背景幻灯片动画在更改之间有延迟
- 使用$(“[property=value]”).click(),我希望两次单击之间有一个延迟