先從乙個例子入手:
(
function()
) console.
log(
'一條訊息'
)settimeout
(function
fun2()
,0) console.
log(
'結束')}
)();
輸出結果很容易知道:
//開始執行
//一條訊息
//結束
//第乙個延時函式訊息
//第二個延時函式訊息
在js事件模型中,執行時從最先進入佇列的訊息開始處理佇列中的訊息,這不難理解,但上述**為什麼settimeout延時為0也會延後執行?
這是因為在js中,
settimeout((
)=>
)settimeout((
)=>,0
)function
promise_func()
)}promise_func()
.then
(data=>
)async
function
fun1()
fun1()
async
function
fun2()
fun2()
promise_func()
.then
(data=>
)console.
log(
"22"
)
列印結果:
22
then 非同步輸出結果
then2 非同步輸出結果
await1 非同步輸出結果
await2 非同步輸出結果
1112
事件模型中加入訊息佇列神馬的一般來說你不去關心是看不清摸不著的,但根據settimeout你可以稍微簡單的感受到裡面的一些情況
不多說,先放乙個簡單例子:
(
function()
,1001);
console.
log(
'一條訊息');
settimeout
(function
cb1(),
1000);
console.
log(
'結束');
})()
可能你會有點猶豫了,其實結果是:
開始
一條訊息
結束第乙個延時器的訊息
第二個延時器的訊息
為啥第乙個延時1.001s比第二個延時1.000s要先執行呢,我們先從settimeout說起
settimeout沒跟同步函式一起被加入到訊息佇列,而是等待同步訊息佇列執行結束開始加入,延遲引數代表訊息被實際加入到佇列的最小延遲時間
如果佇列中沒有其它訊息,在這段延遲時間過去之後,訊息會被馬上處理。但是,如果有其它訊息,settimeout 訊息必須等待其它訊息處理完。
上述**中,第乙個延時函式被加入到訊息佇列,並立即開始執行,等待1.001s後輸出結果,在第乙個延時函式加入到佇列並立即執行這一過程中,第二個延時函式也加入了佇列,這個加入到佇列的過程是需要一定時間的,這個時間取決於cpu的處理速度,當然這個時間是非常短的。
上面是乙個簡單例子,我們誇大一下這個例子,試著讓最後乙個延時1秒的函式等待更多的時間再去執行,比第乙個延時1.0002s的延時函式還要慢,方案就是在這過程中讓更多的延時函式加入訊息佇列。
(
function()
,1002
) console.
log(
'一條訊息'
)for
(let i of
newarray
(1000))
,2000)}
settimeout
(function
cb1(),
1000
) console.
log(
'結束')}
)()
執行結果:
開始
一條訊息
結束第乙個延時器的訊息
最後乙個延時器的訊息
nbnb
......
第乙個延時函式被加入到訊息佇列,並立即開始執行,等待1.002s後輸出結果,當在最後乙個延時函式加入佇列前迴圈加入1000個延時函式時,
最後乙個延時函式是等待前面所有延時函式加入佇列後才開始加入並執行,這個加入佇列的過程花費了一段時間,導致1.002s後第乙個延時函式執行結果最先被輸出
這些示例雖然簡單,但能很好地幫助理解settimeout延時的含義以及js的事件模型
Git從安裝 了解到簡單使用
linux基本操作會之後過來理解快哦 是分布式版本控制系統,比集中式多暫存區 工作區指的是電腦能看到的目錄,如建立的learngit資料夾 版本庫指工作區中的隱藏目錄.git 暫存區位於版本庫中的stage 即add是將檔案修改新增到暫存區,commit是將檔案修改提交到當前分支 git為使用者自動...
從硬體了解定址
學習linux核心,記憶體管理是必學的,但是和自己以前設計解碼電路的定址完全不同,所以對抽象後位址對映不能很好地理解,雖然很多書都有介紹,但是領悟的還是有缺陷。所以這次以intel微處理器為例子,去了解硬體是怎麼定址的,然後在轉到linux系統怎麼抽象的。80x86常見的工作模式有,實模式和保護模式...
從零了解MQ
有從別的地方複製的介紹,侵刪 代表訊息佇列,是一種應用程式對應用程式的通訊方法 通過訊息傳遞佇列傳送和接收訊息資料,達到兩者之間的資訊交換。broker 訊息伺服器,作為server提供訊息核心服務 producer 訊息生產者,業務的發起方,負責生產訊息傳輸給broker,consumer 訊息消...