2010-05-12 55 views
0

我想确保我的理解正确的回调,和一般的JavaScript时机等。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添加到内部函数作为另一个回调?

回答

1

SetList()Some.Code()DoSomething()将按照该顺序一个接一个地执行。作为第二个参数传递给Some.Code()匿名函数可能的Some.Code()执行过程中被调用(在函数返回前,DoSomething()称),或者可以在另一个函数以后的时间被调用,事件处理程序或定时器,这一切都取决于当你指定它被调用时。


由于您使用AJAX,向远程服务器请求被在单独的线程制成,所以执行JavaScript线程继续运行,并调用其它函数直到响应(或者,更具体地,用于onreadystatechange事件发生)。当ajax请求的就绪状态发生变化时,其readystatechange事件处理程序排队等待被调用 - 意味着它将在所有当前正在执行的脚本完成后立即执行。

如果你想DoSomething()通过AJAX收到响应后执行的,你应该把它运行回调函数的末尾来代替。

+0

如何确保在调用DoSomething(_list)之前执行匿名函数; ? – Blankman 2010-05-12 16:37:01

+0

@Blankman:在该方法返回之前,您必须在'Some.Code()'方法期间的某个时刻调用它。 – 2010-05-12 16:39:58

+0

更新了我的问题.. – Blankman 2010-05-12 16:47:19

-1

该代码,以便将执行:

SETLIST(),然后Some.Code(),然后函数(数据),然后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的()当你的回调方法被调用时被调用,而不是之前。

+0

函数(数据)不*按照您所说的顺序执行。它作为参数传递给Some.Code,并且可以随时执行,或根本没有,没有足够的信息可以说。 – Nathan 2011-04-19 02:44:52

+0

函数(数据)是否被调用实际上除了点。正如您在函数(数据)的结构中看到的那样,将调用添加到DoSomething(_list)意味着它成为回调方法的一部分 - 并在所有事件之前触发,从而确保所需的顺序。 – AlishahNovin 2011-04-20 15:23:46

相关问题