国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Node.js 指南(Node.js中的定時器)

econi / 2622人閱讀

摘要:中的定時器中的模塊包含在一段時間后執(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è)置的間隔。

清除未來

如果需要取消TimeoutImmediate對象,可以做些什么?setTimeout()setImmediate()setInterval()返回一個可用于引用設(shè)置TimeoutImmediate對象的計時器對象,通過將所述對象傳遞到相應(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);
留下超時

請記住,setTimeoutsetInterval返回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

相關(guān)文章

  • Node.js 指南(目錄)

    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() 不要阻塞事...

    未東興 評論0 收藏0
  • 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)核。 ...

    pingink 評論0 收藏0
  • Node.js 指南(阻塞與非阻塞概述)

    摘要:標準庫中的所有方法都提供非阻塞的異步版本,并接受回調(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支持的...

    zebrayoung 評論0 收藏0
  • 【譯】Node.js 前端開發(fā)指南

    摘要:定時器在和瀏覽器中的表現(xiàn)形式是相同的。關(guān)于定時器的一個重要的事情是,我們提供的延遲不代表在這個時間之后回調(diào)就會被執(zhí)行。它的真正含義是,一旦主線程完成所有操作包括微任務(wù)并且沒有其它具有更高優(yōu)先級的定時器,將在此時間之后執(zhí)行回調(diào)。 眾成翻譯 原文鏈接 關(guān)于作者 2018年6月21日出版? 本指南面向了解Javascript但尚未十分熟悉Node.js的前端開發(fā)人員。我這里不專注于語言本身...

    CntChen 評論0 收藏0
  • Node.js API參考文檔(目錄)

    摘要:參考文檔是基于的引擎構(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)...

    stormzhang 評論0 收藏0

發(fā)表評論

0條評論

econi

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<