Javascript和计时,特别是回调
我想确保我正确理解回调,以及javascript计时等 假设我的代码看起来像这样,它保证按顺序执行吗Javascript和计时,特别是回调,javascript,callback,Javascript,Callback,我想确保我正确理解回调,以及javascript计时等 假设我的代码看起来像这样,它保证按顺序执行吗 SetList(); // initializes the var _list Some.Code(_list, function(data) { // update list }); DoSomething(_list); // operates on _list 更新 我看到的是SetList调用,然后是DoSomething,然后是Some.Code 一些.Co
SetList(); // initializes the var _list
Some.Code(_list, function(data) {
// update list
});
DoSomething(_list); // operates on _list
更新
我看到的是SetList调用,然后是DoSomething,然后是Some.Code
一些.Code调用另一个函数。因此:
Some.Code(_list, function() {
//load _list from ajax request
Other.Code.WithCallback(_list, function(){....});
});
我想要解决这个问题,我必须将DoSomething作为另一个回调添加到内部函数中?SetList,一些.Code和DoSomething将按该顺序依次执行。匿名函数作为第二个参数传递给Some.Code。在执行Some.Code期间,可以在函数返回和调用DoSomething之前调用该匿名函数,也可以在稍后由另一个函数和事件处理程序或计时器调用该匿名函数,这一切都取决于您指定调用它的时间
由于您使用的是ajax,对远程服务器的请求是在一个单独的线程上发出的,因此正在执行的javascript线程继续运行并调用其他函数,直到触发响应,或者更具体地说,触发onreadystatechange事件。当ajax请求的就绪状态更改时,其readystatechange事件处理程序将排队等待调用,这意味着它将在所有当前执行的脚本完成后立即执行
如果希望在通过ajax接收到响应后执行DoSomething,则应将其运行到回调函数的末尾。该代码将按以下顺序执行: SetList,然后是一些.Code,然后是functiondata,然后是DoSomething JavaScript是单线程的,并按顺序执行。如果在调用另一个函数的某些.Code或functiondata中设置了一个间隔/计时器,那么事情就会发生不同步 如果你有:
var i=0;
functionCall() //some long process that sets i=1;
if (i==1) { alert("In Order!"); } else { alert("Out of Order!"); }
var i=0;
setTimeout(functionCall, 1000) //some long process that sets i=1;
if (i==1) { alert("In Order!"); } else { alert("Out of Order!"); }
这将按顺序发出警报,但如果您有:
var i=0;
functionCall() //some long process that sets i=1;
if (i==1) { alert("In Order!"); } else { alert("Out of Order!"); }
var i=0;
setTimeout(functionCall, 1000) //some long process that sets i=1;
if (i==1) { alert("In Order!"); } else { alert("Out of Order!"); }
这将无序执行,因为第三行将在调用functionCall之前执行
最新答案
因为您使用的是Ajax,我猜您正在进行异步调用,这就是延迟的原因。您有一个回调函数,但它仍在等待回调,因此Javascript在等待时继续执行下一行
要按所需顺序执行,您需要执行以下操作:
SetList(); // initilizes the var _list
Some.Code(_list, function(data) {
// update list
DoSomething(_list); // operates on _list
});
这样,您可以确保在调用回调方法时调用DoSomething,而不是在调用之前。如何确保在调用DoSomething_list;之前执行匿名函数@Blankman:在some.Code方法返回之前,您必须在该方法的某个时间点调用它。functiondata没有按照您所说的顺序执行。它作为一个参数传递给一些.Code,可以随时执行,或者根本不执行,因为没有足够的信息来说明。是否调用functiondata实际上并不重要。正如您在functiondata的结构中所看到的,将调用添加到DoSomething_列表意味着它成为回调方法的一部分,并在前面的所有操作之后触发,以确保所需的顺序。