国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

node.js中的定時(shí)器nextTick()和setImmediate()區(qū)別分析

2019-11-20 13:51:52
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

1.node中使用定時(shí)器的問(wèn)題在于,它并非精確的.譬如setTimeout()設(shè)定一個(gè)任務(wù)在10ms后執(zhí)行,但是在9ms后,有一個(gè)任務(wù)占用了5ms,再次輪到定時(shí)器時(shí),已經(jīng)耽誤了4ms.

好了node中的定時(shí)器就簡(jiǎn)單的講這么多.

2.看代碼:

復(fù)制代碼 代碼如下:

process.nextTick(function(){
    console.log("延遲執(zhí)行");
});
console.log("正常執(zhí)行1");
console.log("正常執(zhí)行2");
console.log("正常執(zhí)行3");
console.log("正常執(zhí)行4");

通過(guò)這個(gè)例子,我想大家很清楚的就能看到nextTick()是用來(lái)干嘛的了.主要是用來(lái)異步執(zhí)行的.

在看代碼:

復(fù)制代碼 代碼如下:

 setImmediate(function(){
     console.log("延遲執(zhí)行");
 });
 console.log("正常執(zhí)行");

我們發(fā)現(xiàn)setImmediate也是異步執(zhí)行的.奇怪了

那么它與nextTick()有什么區(qū)別呢?

看代碼:

代碼一:

復(fù)制代碼 代碼如下:

process.nextTick(function(){
    console.log("nextTick延遲")
});
setImmediate(function(){
    console.log("setImmediate延遲");
});
console.log("正常執(zhí)行");

結(jié)果:

代碼二:

復(fù)制代碼 代碼如下:

setImmediate(function(){
    console.log("setImmediate延遲");
});
process.nextTick(function(){
    console.log("nextTick延遲")
});
console.log("正常執(zhí)行");

結(jié)果:

發(fā)現(xiàn)代碼雖然順序不一樣,但是執(zhí)行的結(jié)果是一樣的.

從結(jié)果可以發(fā)現(xiàn):

nextTick()的回調(diào)函數(shù)執(zhí)行的優(yōu)先級(jí)要高于setImmediate();

process.nextTick()屬于idle觀察者,setImmediate()屬于check觀察者.在每一輪循環(huán)檢查中,idle觀察者先于I/O觀察者,I/O觀察者先于check觀察者.

在具體實(shí)現(xiàn)上,process.nextTick()的回調(diào)函數(shù)保存在一個(gè)數(shù)組中,
setImmediate()的結(jié)果則是保存在鏈表中.
在行為上,process.nextTick()在每輪循環(huán)中會(huì)將數(shù)組中的回調(diào)函數(shù)全部執(zhí)行完.
而setImmediate()在每輪循環(huán)中執(zhí)行鏈表中的一個(gè)回調(diào)函數(shù).

復(fù)制代碼 代碼如下:

//加入2個(gè)nextTick()的回調(diào)函數(shù)
process.nextTick(function(){
    console.log("nextTick延遲執(zhí)行1");
});
process.nextTick(function(){
    console.log("nextTick延遲執(zhí)行2");
});
//加入兩個(gè)setImmediate()回調(diào)函數(shù)
setImmediate(function(){
    console.log("setImmediate延遲執(zhí)行1");
    process.nextTick(function(){
        console.log("強(qiáng)勢(shì)插入");
    });
});
setImmediate(function(){
    console.log("setImmediate延遲執(zhí)行2");
});
console.log("正常執(zhí)行");

從執(zhí)行結(jié)果上看出:當(dāng)?shù)谝粋€(gè)setImmediate()的回調(diào)函數(shù)執(zhí)行完后,并沒(méi)有立即執(zhí)行第二個(gè),而是進(jìn)入了下一輪循環(huán),再次按nextTick()優(yōu)先,setImmediate()次后的順序執(zhí)行.之所以這樣設(shè)計(jì),是為了保證每次循環(huán)能夠較快的執(zhí)行結(jié)束.防止CPU占用過(guò)多而阻塞后續(xù)I/O調(diào)用的情況.

以上就是相關(guān)node.js中的定時(shí)器nextTick()和setImmediate()區(qū)別的資料了,小伙伴們是否清楚了他們之間的區(qū)別了呢?

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 周口市| 陵川县| 怀安县| 香港| 乌海市| 潼关县| 宜川县| 郯城县| 嘉义市| 盐边县| 靖州| 广河县| 汾西县| 兰西县| 伊吾县| 平南县| 鲁甸县| 鹤峰县| 建平县| 敖汉旗| 达日县| 武胜县| 启东市| 崇仁县| 兴隆县| 黄浦区| 淳化县| 措美县| 务川| 无极县| 襄垣县| 乳山市| 闽侯县| 贞丰县| 平泉县| 改则县| 米脂县| 清苑县| 福建省| 鹤岗市| 松原市|