Javascript和时间,特别是回调

时间:2010-05-12 16:28:29

标签: javascript callback

我想确保我能正确理解回调,以及一般的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作为另一个回调添加到内部函数中吗?

2 个答案:

答案 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(),而不是之前。