Javascript 执行两条语句之间需要的延迟
我正在使用extjs 4.2,在一个地方加载store对象,如下所示:Javascript 执行两条语句之间需要的延迟,javascript,extjs,extjs4.1,extjs4.2,Javascript,Extjs,Extjs4.1,Extjs4.2,我正在使用extjs 4.2,在一个地方加载store对象,如下所示: var userDetailStore = Ext.create('Ext.data.Store', { model : 'Person.DetailsModel', autoLoad : true, proxy : { type : 'ajax', method : 'POST', url : 'getValueAction.action',
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.
在下一行中,我想从store对象中获取第一个值的referenceId,如下所示
var empId = userDetailStore.getAt(0).get('referenceId')
我得到这个错误是因为到目前为止,store对象userDetailStore的getCount()给了我零在获取引用ID的行之前,然后代码工作正常。行userDetailStore.getCount()给出了准确的值
因此,我认为在加载存储和使用存储之间需要某种延迟,但我不想显示警报。我甚至用sleep()方法代替了alert语句。但这也不起作用。(顺便说一句,我甚至不想通过执行sleep()来冻结浏览器)
加载存储时我是否做错了什么?是否有任何常规方法,以便在存储完全加载后执行使用存储的代码
有人请帮帮我
关于:
Dev使用加载事件在完全加载后获取计数
userDetailStore.on('load', function(){
alert("Fully loaded");
});
这里将autoload设置为false,在某些操作中,您可以使用load()加载存储
Vijay的答案是正确的,但我想我应该扩展一下这个概念,这样就可以清楚地知道这个答案是如何适合你所做的事情的 重要的是要理解,当您发出AJAX请求时,请求是异步的。实际上,这意味着(正如您所发现的)调用脚本的其余部分不会等待异步进程完成。相反,当您发出一个异步请求时,您的脚本将以愉快的方式继续执行,执行下一行代码 所以,如果你仔细想想,这就是为什么你在商店里没有看到“计数”的原因。当您的异步请求进入服务器,获取结果,然后将其返回到您的请求时,其余的代码一直在执行,而忽略了异步请求中发生的事情(这正是异步请求强大而可怕的原因) 这也是为什么添加警报似乎“修复”了您的问题。调用alert()时,实际上是在警报点停止脚本的执行。但是,由于您的数据请求是异步的,因此单击警报的“确定”按钮(从而恢复脚本处理)所花的时间使异步请求有足够的时间完成其生命周期并更新原始调用对象 有鉴于此,可以理解为什么“延迟”似乎是一种可取的方式,因为警报的“延迟”(或者实际上是“停止”)解决了您的问题(至少表面上是这样)。然而,对于异步请求,您永远不可能真正知道需要多长时间才能完成。如果您有一个大的响应,或者有异常的网络延迟,或者任何其他问题…硬编码的延迟可能会工作,但也可能不会。最让人恼火的是,您永远不会得到一致的结果,并且会不断增加“延迟”,以适应所有可能导致异步请求花费越来越长时间的因素 这就是为什么存储的load()事件(以及通常的回调)是理解和实现的关键概念。通过侦听load()事件,然后仅在该事件触发的上下文中执行所需的代码,可以确定存储的异步数据请求已完成 如果您以前没有使用过回调和事件处理,那么要打破线性的、过程性的思维定势确实需要一点习惯。然而,在处理AJAX请求时,尤其是在处理事件驱动框架(如ExtJS4)时,为了构建有效且一致的应用程序,您需要采用这个概念
store.load({
callback: function(records, operation, success) {
// do something after the load finishes
},
scope: this
});