2011-12-11 75 views
2

我在我的Firefox上运行这些代码,并且console得到3 2 1,这意味着语句在前一个结束之前运行。下一个语句在前一个结束之前运行

function test(){ 
    setTimeout(function(){console.log(1)},1000); //statement 0 
    setTimeout(function(){console.log(2)},500);  //statement 1 
} 
test(); 
console.log(3);          //statement 2 

它是javascript的一个功能,我是否必须在分配给它一些值后仔细检查一个变量? Cuz'太复杂了。

var a; 
while(a!==get('some')){ 
    a=get('some'); 
    if(a===get('some')){ 
     whatShouldBeRun();afterGetSome(); 
     break; 
    } 
} 

回答

3

这正是你要求它做的。首先,你要求它启动两个声明来运行未来的某个点。然后你写“3”。其中第一个运行时间的语句运行,并写入“2”。最后,这些运行的第三个并写入“1”。

如果您使用的是异步处理 - settimeout - 那么您需要像使用其他语言一样处理此问题。但是,如果您需要按顺序运行,请不要让它异步运行。

为了让他们运行一个接一个:

function test() 
{ 
    setTimeout(function() 
    { 
     console.log(1);setTimeout(function() 
      { 
        console.log(2);console.log(3) 
      },500) 
    },1000); 
} 

test(); 

[我可能有一些这种错误的]

+0

我使用'的setTimeout()',以刺激其需要很长的时间的功能,比如网络或sql查询。我怎么能够知道一个函数是否异步运行,比如添加大量函数或处理大量文本的函数? – Rufus

+1

超时显式异步运行。就像ajax调用一样。这很大程度上取决于你在做什么样的呼叫。如果他们运行异步,那么你将不得不修改你的处理来处理这个。请参阅编辑我的答案。 –

+0

谢谢,我有一个线索在租赁:) – Rufus

1

上述代码开始两个timers,它将在500和1000毫秒后触发。 console.log(3);将首先运行,毫不拖延;在500毫秒之后,console.log(2)将被执行,并且在另外500毫秒之后,来到console.log(1)。这是定时器如何在包含定时器的任何语言/框架中工作的一般通用方式。

顺序代码依次运行,即后续代码行按顺序执行。基于事件的系统,如Web浏览器及其JavaScript实现,不同之处在于,事件处理程序仅在事件发生时执行。代码test(); console.log(3);被顺序执行:通过调用setTimeout以给定的时间间隔和事件处理程序启动两个定时器,并将3写入控制台。第一个定时器的“滴答”事件在500毫秒之后,其事件处理函数将把2写入控制台。第二个的“滴答”事件在另一个500毫秒之后,并将写入1

相关问题