2011-12-11 90 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

相關問題