我想确保我能正确理解回调,以及一般的javascript计时等。
说我的代码看起来像这样,是否保证按顺序执行?
SetList(); // initializes the var _list
Some.Code(_list, function(data) {
// update list
});
DoSomething(_list); // operates on _list
更新
我看到的是SetList调用,然后是DoSomething,然后是Some.Code。
Some.Code调用另一个函数。这样:
Some.Code(_list, function() {
//load _list from ajax request
Other.Code.WithCallback(_list, function(){....});
});
我想解决这个问题,我必须将DoSomething作为另一个回调添加到内部函数中吗?
答案 0 :(得分:1)
SetList()
,Some.Code()
和DoSomething()
将按顺序执行,一个接一个。作为Some.Code()
的第二个参数传递的匿名函数可以在执行Some.Code()
期间调用(在函数返回并调用DoSomething()
之前),或者可以在以后通过另一个函数,事件处理程序或计时器,这一切都取决于你指定它被调用的时间。
由于你正在使用ajax,对远程服务器的请求是在一个单独的线程上进行的,因此执行的javascript线程继续运行并调用其他函数直到响应(或者更具体地说,对于{{1}事件发生)。当ajax请求的就绪状态发生变化时,其onreadystatechange
事件处理程序将排队等待调用 - 这意味着它将在所有当前正在执行的脚本完成后立即执行。
如果您希望在通过ajax收到响应后执行readystatechange
,则应将其运行到回调函数的末尾。
答案 1 :(得分:-1)
该代码将按顺序执行:
SetList(),然后是Some.Code(),然后是function(data),然后是DoSomething()。
JavaScript是单线程的,并按顺序执行。事物不同步的唯一方法是在Some.Code()或调用另一个函数的函数(数据)中设置间隔/计时器。
如果你有:
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(),而不是之前。