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