摘要:中的定時器中的模塊包含在一段時間后執(zhí)行代碼的函數(shù),定時器不需要通過導(dǎo)入,因為所有方法都可以在全局范圍內(nèi)模擬瀏覽器,要完全了解何時執(zhí)行定時器功能,最好先閱讀事件循環(huán)。
Node.js中的定時器
Node.js中的Timers模塊包含在一段時間后執(zhí)行代碼的函數(shù),定時器不需要通過require()導(dǎo)入,因為所有方法都可以在全局范圍內(nèi)模擬瀏覽器JavaScript API,要完全了解何時執(zhí)行定時器功能,最好先閱讀Node.js事件循環(huán)。
用Node.js控制時間連續(xù)性Node.js API提供了幾種調(diào)度代碼的方法,以便在當前時刻之后的某個時刻執(zhí)行,下面的函數(shù)可能看起來很熟悉,因為它們在大多數(shù)瀏覽器中都可用,但Node.js實際上提供了這些方法的自己的實現(xiàn),定時器與系統(tǒng)緊密集成,盡管API鏡像了瀏覽器API,但實現(xiàn)方面存在一些差異。
“我說的時候”執(zhí)行 ~ setTimeout()setTimeout()可用于在指定的毫秒數(shù)后調(diào)度代碼執(zhí)行,此函數(shù)類似于瀏覽器JavaScript API中的window.setTimeout(),但是無法傳遞一串代碼來執(zhí)行。
setTimeout()接受一個函數(shù)作為第一個參數(shù)執(zhí)行,毫秒延遲定義為一個數(shù)字作為第二個參數(shù),還可以包括其他參數(shù),并將這些參數(shù)傳遞給函數(shù),這是一個例子:
function myFunc(arg) { console.log(`arg was => ${arg}`); } setTimeout(myFunc, 1500, "funky");
由于調(diào)用了setTimeout(),上面的函數(shù)myFunc()將盡可能接近1500毫秒(或1.5秒)執(zhí)行。
設(shè)置的超時間隔不能依賴于在該精確的毫秒數(shù)之后執(zhí)行,這是因為阻塞或保留在事件循環(huán)上的其他執(zhí)行代碼將推遲執(zhí)行超時,唯一的保證是超時不會比聲明的超時間隔更早執(zhí)行。
setTimeout()返回一個Timeout對象,該對象可用于引用已設(shè)置的超時,此返回的對象可用于取消超時(請參閱下面的clearTimeout())以及更改執(zhí)行行為(請參閱下面的unref())。
“在此之后”執(zhí)行 ~ setImmediate()setImmediate()將在當前事件循環(huán)周期結(jié)束時執(zhí)行代碼,此代碼將在當前事件循環(huán)中的任何I/O操作之后以及為下一個事件循環(huán)調(diào)度的任何計時器之前執(zhí)行,這個代碼執(zhí)行可以被認為是“正好在此之后”,這意味著setImmediate()函數(shù)調(diào)用之后的任何代碼都將在setImmediate()函數(shù)參數(shù)之前執(zhí)行。
setImmediate()的第一個參數(shù)將是要執(zhí)行的函數(shù),任何后續(xù)參數(shù)將在執(zhí)行時傳遞給函數(shù),這是一個例子:
console.log("before immediate"); setImmediate((arg) => { console.log(`executing immediate: ${arg}`); }, "so immediate"); console.log("after immediate");
傳遞給setImmediate()的上述函數(shù)將在所有可運行代碼執(zhí)行后執(zhí)行,控制臺輸出將為:
before immediate after immediate executing immediate: so immediate
setImmediate()返回一個Immediate對象,可用于取消已調(diào)度的immediate(請參閱下面的clearImmediate())。
注意:不要混淆setImmediate()和process.nextTick(),它們有一些主要的不同之處,第一個是process.nextTick()將在任何設(shè)置的Immediate之前以及任何調(diào)度的I/O之前運行,第二個是process.nextTick()是不可清除的,意思是一旦代碼被安排用process.nextTick()執(zhí)行,就無法停止執(zhí)行,就像使用普通函數(shù)一樣,請參閱本指南以更好地理解process.nextTick()的操作。
“無限循環(huán)”執(zhí)行 ~ setInterval()如果存在應(yīng)該多次執(zhí)行的代碼塊,則可以使用setInterval()來執(zhí)行該代碼,setInterval()接受一個函數(shù)參數(shù),它將以給定的毫秒延遲作為第二個參數(shù)運行無限次,就像setTimeout()一樣,可以在延遲之外添加其他參數(shù),并將這些參數(shù)傳遞給函數(shù)調(diào)用。也像setTimeout()一樣,由于可能保留在事件循環(huán)上的操作,因此無法保證延遲,因此應(yīng)將其視為近似延遲,見下面的例子:
function intervalFunc() { console.log("Cant stop me now!"); } setInterval(intervalFunc, 1500);
在上面的例子中,intervalFunc()大約每1500毫秒或1.5秒執(zhí)行一次,直到它被停止為止(見下文)。
與setTimeout()一樣,setInterval()也返回一個Timeout對象,該對象可用于引用和修改已設(shè)置的間隔。
清除未來如果需要取消Timeout或Immediate對象,可以做些什么?setTimeout()、setImmediate()和setInterval()返回一個可用于引用設(shè)置Timeout或Immediate對象的計時器對象,通過將所述對象傳遞到相應(yīng)的clear函數(shù),將完全停止該對象的執(zhí)行。相應(yīng)的函數(shù)是clearTimeout(),clearImmediate()和clearInterval(),請參閱下面的示例,了解每個示例:
const timeoutObj = setTimeout(() => { console.log("timeout beyond time"); }, 1500); const immediateObj = setImmediate(() => { console.log("immediately executing immediate"); }); const intervalObj = setInterval(() => { console.log("interviewing the interval"); }, 500); clearTimeout(timeoutObj); clearImmediate(immediateObj); clearInterval(intervalObj);留下超時
請記住,setTimeout和setInterval返回Timeout對象,Timeout對象提供了兩個函數(shù),旨在使用unref()和ref()來增強Timeout行為。如果使用set函數(shù)調(diào)度Timeout對象,則可以在該對象上調(diào)用unref(),這將稍微改變行為,如果它是要執(zhí)行的最后一個代碼,則不會調(diào)用Timeout對象,Timeout對象不會使進程保持活動狀態(tài),等待執(zhí)行。
以類似的方式,調(diào)用了unref()的Timeout對象可以通過在同一個Timeout對象上調(diào)用ref()來刪除該行為,然后確保其執(zhí)行。但請注意,出于性能原因,這并不能完全恢復(fù)初始行為,請參閱以下兩個示例:
const timerObj = setTimeout(() => { console.log("will i run?"); }); // if left alone, this statement will keep the above // timeout from running, since the timeout will be the only // thing keeping the program from exiting timerObj.unref(); // we can bring it back to life by calling ref() inside // an immediate setImmediate(() => { timerObj.ref(); });進一步了解事件循環(huán)
事件循環(huán)和計時器比本指南所涵蓋的要多得多,要了解有關(guān)Node.js事件循環(huán)內(nèi)部以及計時器在執(zhí)行期間如何操作的更多信息,請查看此Node.js指南:Node.js事件循環(huán)、定時器和process.nextTick()。
上一篇:不要阻塞事件循環(huán)(或工作池) 下一篇:HTTP事務(wù)的剖析文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/100228.html
Node.js 指南 Node.js?是基于Chrome的V8 JavaScript引擎構(gòu)建的JavaScript運行時。 常規(guī) 關(guān)于Node.js 入門指南 輕松分析Node.js應(yīng)用程序 Docker化Node.js Web應(yīng)用程序 遷移到安全的Buffer構(gòu)造函數(shù) Node.js核心概念 阻塞與非阻塞概述 Node.js事件循環(huán)、定時器和process.nextTick() 不要阻塞事...
摘要:檢索新的事件執(zhí)行與相關(guān)的回調(diào)幾乎所有,除了由定時器調(diào)度的一些和將在適當?shù)臅r候在這里阻塞。在事件循環(huán)的每次運行之間,檢查它是否在等待任何異步或定時器,如果沒有,則徹底關(guān)閉。 Node.js事件循環(huán)、定時器和process.nextTick() 什么是事件循環(huán)? 事件循環(huán)允許Node.js執(zhí)行非阻塞I/O操作 — 盡管JavaScript是單線程的 — 通過盡可能將操作卸載到系統(tǒng)內(nèi)核。 ...
摘要:標準庫中的所有方法都提供非阻塞的異步版本,并接受回調(diào)函數(shù),某些方法還具有對應(yīng)的阻塞方法,其名稱以結(jié)尾。比較代碼阻塞方法同步執(zhí)行,非阻塞方法異步執(zhí)行。 阻塞與非阻塞概述 此概述介紹了Node.js中阻塞與非阻塞調(diào)用之間的區(qū)別,此概述將引用事件循環(huán)和libuv,但不需要事先了解這些主題,假設(shè)讀者對JavaScript語言和Node.js回調(diào)模式有基本的了解。 I/O主要指與libuv支持的...
摘要:定時器在和瀏覽器中的表現(xiàn)形式是相同的。關(guān)于定時器的一個重要的事情是,我們提供的延遲不代表在這個時間之后回調(diào)就會被執(zhí)行。它的真正含義是,一旦主線程完成所有操作包括微任務(wù)并且沒有其它具有更高優(yōu)先級的定時器,將在此時間之后執(zhí)行回調(diào)。 眾成翻譯 原文鏈接 關(guān)于作者 2018年6月21日出版? 本指南面向了解Javascript但尚未十分熟悉Node.js的前端開發(fā)人員。我這里不專注于語言本身...
摘要:參考文檔是基于的引擎構(gòu)建的運行時。關(guān)于文檔用法和示例斷言測試穩(wěn)定性穩(wěn)定模塊提供了一組簡單的斷言測試,可用于測試不變量。存在和模式,但建議僅使用模式。類在全局作用域內(nèi),因此不太可能需要使用。以下所有示例均可供下載,可用作擴展庫的起點。 Node.js v11.5.0 API參考文檔 Node.js?是基于Chrome的V8 JavaScript引擎構(gòu)建的JavaScript運行時。 關(guān)...
閱讀 1683·2023-04-25 20:16
閱讀 3838·2021-10-09 09:54
閱讀 2696·2021-09-04 16:40
閱讀 2517·2019-08-30 15:55
閱讀 830·2019-08-29 12:37
閱讀 2733·2019-08-26 13:55
閱讀 2903·2019-08-26 11:42
閱讀 3144·2019-08-23 18:26