JS 同步與非同步程式設計

2022-08-26 13:21:18 字數 2018 閱讀 8756

js是單執行緒的, js就是個傻子, 腦子一根筋, 做著當前的這件事情, 沒有完成之前絕不會做下一件事情

同步上一件事情沒有完成, 繼續處理上一件事情, 只有上一件事情完成了, 才會做另一件事情(js中大部分都是同步程式設計的)

for(var i = 0; i < 10000; i ++)

console.log("ok")

}

-> 迴圈結束了~~

-> ok

for迴圈就是同步程式設計的, 只有迴圈結束後, 才會繼續執行下面的**

while(1)

console.log("ok")

永遠都不會執行 console.log("ok"), 因為上面的迴圈是死迴圈, 永遠都不會結束

非同步

規劃要做一件事情, 但是不是當前立馬去執行這件事情, 需要等一定的時間, 這樣的話, 我們不會等著它執行, 而是繼續執行下面的操作, "只有當下面的事情都處理完成了", 只有當下面的事情都處理了, 才會返回頭處理之前的事情; 如果下面的事情並沒有處理完成, 不管之前的事情有沒有到時間, 都踏踏實實的給我等著

實現方法

在js中非同步程式設計只有四種情況:

定時器

var n = 0;

window.settimeout(function(), 1000);

console.log(n);

-> 0

-> 1

不立即執行

每乙個瀏覽器對於定時器的等待時間都有乙個最小的值, 谷歌:5~6ms ie:10~13ms, 如果設定的等待時間小於這個值, 不起作用, 還是需要等到最小時間才執行; 尤其是寫0也不是立即執行.

var n = 0;

window.settimeout(function(), 0);

console.log(n);

-> 0

-> 1

不保證準確的執行時間

我們定時器設定的等待時間不一定就是最終執行的時間, 如果定時器之後還有其他的事情正在處理中, 不管定時器的時間有沒有到, 都是不會執行定時器的

var n = 0;

window.settimeout(function(), 0);

console.log(n);

while(1)

console.log(n)

-> 0

進入死迴圈, 瀏覽器卡死

任務佇列
var n = 0;

window.settimeout(function (), 2);

window.settimeout(function (), 1);

console.log(n);

for(var i =0; i < 10000000; i++)

console.log(n);

-> 0

-> 0

-> 5

-> 7

任務佇列池

任務 -> 2ms執行

將任務->1ms執行新增到佇列池中, 發現時間更短的在任務佇列中提前排列

任務 -> 1ms執行

任務 -> 2ms執行

執行區var n = 0;

console.log(n); ->0

執行一千萬次的迴圈, 可能消耗的時間大於20ms也可能小於20ms

console.log(n) -> 0

此時的立即執行的任務都完成了

返回頭開始按照任務池中的任務佇列的順序開始從上到下執行.

for(var i=0; i-> 3

-> 3

-> 3

使用者點選的時候, 迴圈已經執行完了, i已經變成了3.

JS的同步與非同步

我們都知道js的 是同步執行的,也就是按照我們所書寫的順序一一執行,但是有3個特殊,他們屬於非同步執行 計時器 setinterval,settimeout 事件 onclick,onkeydown等 ajax 接下來我們分析比較一下同步執行的 和非同步執行的 之間的一些執行邏輯 1239 1011...

JS中的同步與非同步

一 js中同步非同步程式設計 瀏覽器是多執行緒,js是單執行緒的 瀏覽器只分配乙個執行緒來執行js 程序大執行緒小 乙個程序中包含多個執行緒,例如在瀏覽器中開啟乙個html頁面就占用了乙個程序,載入頁面的時候,瀏覽器分配乙個執行緒去計算dom樹,分配其他的執行緒去載入 對應的資源檔案。在分配乙個執行...

Python async非同步程式設計與同步對比

同步 def test1 for i in range 10 time.sleep 3 print i,test1 def test2 for i in range 15 time.sleep 2 print i,test2 start time time.time test1 test2 end ...