国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Table des matières
Programmation asynchrone en JavaScript
JavaScript est synchrone
JavaScript bloque
JavaScript est monothread
En attente de JavaScript
Node.js Runtime
Libuv
Exécution de code dans le runtime Node.js
同步代碼執(zhí)行
異步代碼執(zhí)行
Libuv 和異步操作
Qu'est-ce que la boucle d'événement??
Boucle d'événements visuels
事件循環(huán)是如何工作的?
??Comment fonctionne la boucle d'événements?? ??????La flèche sur l'image est un indice, mais elle n'est peut-être pas facile à comprendre. Laissez-moi vous expliquer l'ordre de priorité de la file d'attente. La première chose à savoir est que tout le code JavaScript synchrone écrit par l’utilisateur a priorité sur le code asynchrone. Cela signifie que la boucle d'événements ne fonctionne que lorsque la pile d'appels est vide. ????Dans la boucle événementielle, l'ordre d'exécution suit certaines règles. Il reste encore quelques règles à ma?triser. Examinons-les une par une?: ??
    ??Exécutez toutes les fonctions de rappel dans la file d'attente des microtaches. D’abord les taches de la file d’attente nextTick, puis les taches de la file d’attente Promise. ??Exécutez toutes les fonctions de rappel dans la file d'attente du minuteur. ??S'il y a une fonction de rappel dans la file d'attente des microtaches, toutes les fonctions de rappel dans la file d'attente des microtaches seront exécutées après l'exécution de chaque fonction de rappel dans la file d'attente du minuteur??. D’abord les taches de la file d’attente nextTick, puis les taches de la file d’attente Promise. ??Exécutez toutes les fonctions de rappel dans la file d'attente d'E/S. ??S'il y a des fonctions de rappel dans la file d'attente des microtaches, toutes les fonctions de rappel dans la file d'attente des microtaches seront exécutées séquentiellement dans l'ordre de la file d'attente nextTick puis de la file d'attente Promise. ??Exécutez toutes les fonctions de rappel dans la file d'attente de vérification. ??S'il y a une fonction de rappel dans la file d'attente des microtaches, toutes les fonctions de rappel dans la file d'attente des microtaches seront exécutées après ??vérification de chaque rappel dans la file d'attente. D’abord les taches de la file d’attente nextTick, puis les taches de la file d’attente Promise. ??Exécutez toutes les fonctions de rappel dans la file d'attente de fermeture. ??à la fin de la même boucle, exécutez à nouveau la file d'attente des microtaches. D’abord les taches de la file d’attente nextTick, puis les taches de la file d’attente Promise.
??à ce stade, s'il y a plus de rappels à traiter, la boucle d'événements s'exécutera à nouveau (Annotation?: la boucle d'événements continue de s'exécuter pendant que le programme est en cours d'exécution, et il n'y a actuellement aucune tache à traiter Ensuite, il sera en attente et sera exécuté dès qu'il y aura une nouvelle tache), et répétez les mêmes étapes. En revanche, si tous les rappels ont été exécutés et qu'il n'y a plus de code à traiter, la boucle d'événements se termine. ????C'est ce que fait la boucle d'événements libuv pour exécuter du code asynchrone dans Node.js. Avec ces règles en main, nous pouvons revenir sur les questions que nous avons posées plus t?t. ??
????Lorsqu'une tache asynchrone est terminée dans libuv, quand Node exécutera-t-il la fonction de rappel associée sur la pile d'appels?? ??????Réponse?: La fonction de rappel n'est exécutée que lorsque la pile d'appels est vide. ?????? Node attendra-t-il que la pile d'appels soit vide avant d'exécuter la fonction de rappel?? Ou interrompre le flux d'exécution normal pour exécuter la fonction de rappel?? ??????Réponse?:L'exécution d'une fonction de rappel n'interrompt pas le flux normal d'exécution. ??????Méthodes comme setTimeout et setInterval qui retardent l'exécution des fonctions de rappel. Quand la fonction de rappel sera-t-elle exécutée?? ????
" >Mais vous vous demandez peut-être?: "Où est le code pour vérifier cette visualisation??". Eh bien, chaque file d'attente dans la boucle d'événements a des nuances d'implémentation, nous ferions donc mieux d'en parler une par une. Cet article est le premier d'une série sur la boucle d'événements Node.js. Assurez-vous de consulter le lien à la fin de l'article pour comprendre les détails de l'opération dans chaque file d'attente. Même si vous avez une profonde impression en tête maintenant, vous risquez encore de tomber dans certains pièges lorsque vous arrivez au scénario spécifique. .
Maison interface Web js tutoriel Parlons de la boucle d'événements dans Node

Parlons de la boucle d'événements dans Node

Apr 11, 2023 pm 07:08 PM
javascript l'extrémité avant node.js

La boucle d'événements est un élément fondamental de Node.js. Elle permet une programmation asynchrone en garantissant que le thread principal n'est pas bloqué. Comprendre la boucle d'événements est crucial pour créer des applications efficaces. L'article suivant vous donnera une compréhension approfondie de la boucle d'événements dans Node. J'espère qu'il vous sera utile !

Parlons de la boucle dévénements dans Node

Vous utilisez Node.js depuis un certain temps, avez créé quelques applications, essayé différents modules et vous êtes même à l'aise avec la programmation asynchrone. Mais quelque chose continue de vous déranger : la boucle des événements.

Si vous êtes comme moi, vous avez passé d'innombrables heures à lire de la documentation et à regarder des vidéos pour essayer de comprendre la boucle de l'événement. Mais même en tant que développeur expérimenté, vous aurez peut-être du mal à comprendre pleinement son fonctionnement. C'est pourquoi j'ai préparé ce guide visuel pour vous aider à bien comprendre la boucle d'événements Node.js. Alors asseyez-vous, prenez une tasse de café et plongeons dans le monde de la boucle d'événements Node.js. [Recommandations de didacticiels connexes?: Tutoriel vidéo Nodejs, Enseignement de la programmation]

Programmation asynchrone en JavaScript

Nous commencerons par un examen de la programmation asynchrone en JavaScript. Bien que JavaScript soit utilisé dans les applications Web, mobiles et de bureau, il est important de se rappeler que, à la base, JavaScript est un langage synchrone, bloquant et à thread unique . Comprenons cette phrase à travers un court extrait de code.

// index.js

function A() {
  console.log("A");
}

function B() {
  console.log("B");
}

A()
B()

// Logs A and then B

JavaScript est synchrone

Si nous avons deux fonctions qui enregistrent les messages sur la console, le code sera exécuté de haut en bas, une ligne à la fois. Dans l'extrait de code ci-dessus, nous voyons que A est enregistré avant B.

JavaScript bloque

JavaScript bloque en raison de sa nature synchrone. Quelle que soit la durée du processus précédent, les processus suivants ne démarreront pas tant que le premier ne sera pas terminé. Dans l'extrait de code, si la fonction A doit exécuter un gros bloc de code, JavaScript doit terminer cette opération sans se connecter à la fonction B. Même si ce bout de code prend 10 secondes voire une minute.

Vous avez peut-être rencontré cette situation dans votre navigateur. Lorsqu'une application Web s'exécute dans le navigateur et exécute des blocs de code intensifs sans rendre le contr?le au navigateur, celui-ci peut se bloquer, ce que l'on appelle un blocage. Le navigateur ne peut pas continuer à traiter les entrées de l'utilisateur et à effectuer d'autres taches jusqu'à ce que l'application Web rende le contr?le du processeur au navigateur.

JavaScript est monothread

Un thread est le processus que votre programme JavaScript peut utiliser pour exécuter des taches. Chaque thread ne peut effectuer qu'une seule tache à la fois. Contrairement à d'autres langages qui prennent en charge le multithreading et peuvent exécuter plusieurs taches simultanément, JavaScript n'a qu'un seul thread appelé thread principal qui exécute le code.

En attente de JavaScript

Comme vous pouvez l'imaginer, ce modèle JavaScript crée des problèmes car nous devons attendre que les données soient récupérées avant de pouvoir continuer à exécuter le code. Cette attente peut prendre plusieurs secondes, pendant lesquelles nous ne pouvons exécuter aucun autre code. Si JavaScript continue le traitement sans attendre, une erreur se produit. Nous devons implémenter un comportement asynchrone en JavaScript. Allons dans Node.js et jetons un coup d'?il.

Node.js Runtime

Parlons de la boucle dévénements dans Node

Le runtime Node.js est un environnement qui vous permet d'utiliser et d'exécuter des programmes JavaScript sans utiliser de navigateur. Core - le runtime Node, se compose de trois composants principaux.

  • Les dépendances externes - telles que V8, libuv, crypto, etc. - sont des fonctionnalités requises de Node.js
  • Les fonctionnalités C++ fournissent des fonctionnalités telles que l'accès au système de fichiers et la mise en réseau.
  • La bibliothèque JavaScript fournit des fonctions et des outils pour appeler facilement des fonctionnalités C++ à l'aide de code JavaScript.

Bien que tous les éléments soient importants, le composant clé de la programmation asynchrone dans Node.js est libuv.

Libuv

Libuv est une bibliothèque open source multiplateforme écrite en langage C. Dans le runtime Node.js, son r?le est de fournir un support pour la gestion des opérations asynchrones. Voyons comment cela fonctionne.

Exécution de code dans le runtime Node.js

Parlons de la boucle dévénements dans Node

讓我們來(lái)概括一下代碼在 Node 運(yùn)行時(shí)中的執(zhí)行方式。在執(zhí)行代碼時(shí),位于圖片左側(cè)的 V8 引擎負(fù)責(zé) JavaScript 代碼的執(zhí)行。該引擎包含一個(gè)內(nèi)存堆(Memory heap)和一個(gè)調(diào)用棧(Call stack)。

每當(dāng)聲明變量或函數(shù)時(shí),都會(huì)在堆上分配內(nèi)存。執(zhí)行代碼時(shí),函數(shù)就會(huì)被推入調(diào)用棧中。當(dāng)函數(shù)返回時(shí),它就從調(diào)用棧中彈出了。這是對(duì)棧數(shù)據(jù)結(jié)構(gòu)的簡(jiǎn)單實(shí)現(xiàn),最后添加的項(xiàng)是第一個(gè)被移除。在圖片右側(cè),是負(fù)責(zé)處理異步方法的 libuv。

每當(dāng)我們執(zhí)行異步方法時(shí),libuv 接管任務(wù)的執(zhí)行。然后使用操作系統(tǒng)本地異步機(jī)制運(yùn)行任務(wù)。如果本地機(jī)制不可用或不足,則利用其線程池來(lái)運(yùn)行任務(wù),并確保主線程不被阻塞。

同步代碼執(zhí)行

首先,讓我們來(lái)看一下同步代碼執(zhí)行。以下代碼由三個(gè)控制臺(tái)日志語(yǔ)句組成,依次記錄“First”,“Second”和“Third”。我們按照運(yùn)行時(shí)執(zhí)行順序來(lái)查看代碼。

// index.js
console.log("First");
console.log("Second");
console.log("Third");

以下是 Node 運(yùn)行時(shí)執(zhí)行同步代碼的可視化展示。

Parlons de la boucle dévénements dans Node

執(zhí)行的主線程始終從全局作用域開(kāi)始。全局函數(shù)(如果我們可以這樣稱呼它)被推入堆棧中。然后,在第 1 行,我們有一個(gè)控制臺(tái)日志語(yǔ)句。這個(gè)函數(shù)被推入堆棧中。假設(shè)這個(gè)發(fā)生在 1 毫秒時(shí),“First” 被記錄在控制臺(tái)上。然后,這個(gè)函數(shù)從堆棧中彈出。

執(zhí)行到第 2 行時(shí)。假設(shè)到第 2 毫秒了,log 函數(shù)再次被推入堆棧中?!癝econd”被記錄在控制臺(tái)上,并彈出該函數(shù)。

最后,執(zhí)行到第 3 行了。第 3 毫秒時(shí),log 函數(shù)被推入堆棧,“Third”將記錄在控制臺(tái)上,并彈出該函數(shù)。此時(shí)已經(jīng)沒(méi)有代碼要執(zhí)行,全局也被彈出。

異步代碼執(zhí)行

接下來(lái),讓我們看一下異步代碼執(zhí)行。有以下代碼片段:包含三個(gè)日志語(yǔ)句,但這次第二個(gè)日志語(yǔ)句傳遞給了fs.readFile() 作為回調(diào)函數(shù)。

Parlons de la boucle dévénements dans Node

執(zhí)行的主線程始終從全局作用域開(kāi)始。全局函數(shù)被推入堆棧。然后執(zhí)行到第 1 行,在第 1 毫秒時(shí),“First”被記錄在控制臺(tái)中,并彈出該函數(shù)。然后執(zhí)行移動(dòng)到第 2 行,在第 2毫秒時(shí),readFile 方法被推入堆棧。由于 readFile 是異步操作,因此它會(huì)轉(zhuǎn)移(off-loaded)到 libuv。

JavaScript 從調(diào)用堆棧中彈出了 readFile 方法,因?yàn)榫偷?2 行的執(zhí)行而言,它的工作已經(jīng)完成了。在后臺(tái),libuv 開(kāi)始在單獨(dú)的線程上讀取文件內(nèi)容。在第 3 毫秒時(shí),JavaScript 繼續(xù)進(jìn)行到第 5 行,將 log 函數(shù)推入堆棧,“Third”被記錄到控制臺(tái)中,并將該函數(shù)彈出堆棧。

大約在第 4 毫秒左右,假設(shè)文件讀取任務(wù)已經(jīng)完成,則相關(guān)回調(diào)函數(shù)現(xiàn)在會(huì)在調(diào)用棧上執(zhí)行, 在回調(diào)函數(shù)內(nèi)部遇到 log 函數(shù)。

log 函數(shù)推入到到調(diào)用棧,“Second”被記錄到控制臺(tái)并彈出 log 函數(shù) 。由于回調(diào)函數(shù)中沒(méi)有更多要執(zhí)行的語(yǔ)句,因此也被彈出 。沒(méi)有更多代碼可運(yùn)行了 ,所以全局函數(shù)也從堆棧中刪除 。

控制臺(tái)輸出“First”,“Third”,然后是“Second”。

Libuv 和異步操作

很明顯,libuv 用于處理 Node.js 中的異步操作。對(duì)于像處理網(wǎng)絡(luò)請(qǐng)求這樣的異步操作,libuv 依賴于操作系統(tǒng)原生機(jī)制。對(duì)于沒(méi)有本地 OS 支持的異步讀取文件的操作,libuv 則依賴其線程池以確保主線程不被阻塞。然而,這也引發(fā)了一些問(wèn)題。

  • 當(dāng)一個(gè)異步任務(wù)在 libuv 中完成時(shí),什么時(shí)候 Node 會(huì)在調(diào)用棧上運(yùn)行相關(guān)聯(lián)的回調(diào)函數(shù)?
  • Node 是否會(huì)等待調(diào)用棧為空后再運(yùn)行回調(diào)函數(shù)?還是打斷正常執(zhí)行流來(lái)運(yùn)行回調(diào)函數(shù)?
  • setTimeoutsetInterval 這類延遲執(zhí)行回調(diào)函數(shù)的方法又是何時(shí)執(zhí)行回調(diào)函數(shù)呢?
  • 如果 setTimeoutreadFile 這類異步任務(wù)同時(shí)完成,Node 如何決定哪個(gè)回調(diào)函數(shù)先在調(diào)用棧上運(yùn)行?其中一個(gè)會(huì)有更多的優(yōu)先級(jí)嗎?

所有這些問(wèn)題都可以通過(guò)理解 libuv 核心部分——事件循環(huán)來(lái)得到答案。

Qu'est-ce que la boucle d'événement??

Techniquement parlant, la boucle d'événements n'est qu'un programme en langage C. Mais dans Node.js, vous pouvez le considérer comme un modèle de conception permettant de coordonner l'exécution de code synchrone et asynchrone.

Boucle d'événements visuels

La boucle d'événements est une boucle qui s'exécute tant que votre application Node.js est en cours d'exécution. Il existe six files d'attente différentes dans chaque boucle, chacune contenant une ou plusieurs fonctions de rappel qui doivent éventuellement être exécutées sur la pile d'appels.

Parlons de la boucle dévénements dans Node

  • Tout d'abord, il existe une file d'attente de minuterie (techniquement appelée min-heap), qui est stockée en relation avec la fonction de rappel setTimeout et setInterval.
  • setTimeoutsetInterval 相關(guān)的回調(diào)函數(shù)。
  • 其次,有一個(gè) I/O 隊(duì)列(I/O queue),其中包含與所有異步方法相關(guān)的回調(diào)函數(shù),例如 fshttp 模塊中提供的相關(guān)方法。
  • 第三個(gè)是檢查隊(duì)列(check queue),它保存與 setImmediate 函數(shù)相關(guān)的回調(diào)函數(shù),這是特定于Node 的功能。
  • 第四個(gè)是關(guān)閉隊(duì)列(close queue),它保存與異步任務(wù)關(guān)閉事件相關(guān)聯(lián)的回調(diào)函數(shù)。

最后,有兩個(gè)不同隊(duì)列組成微任務(wù)隊(duì)列(microtask queue)。

  • nextTick 隊(duì)列保存了與 process.nextTick 函數(shù)關(guān)聯(lián)的回調(diào)函數(shù)。
  • Promise 隊(duì)列則保存了JavaScript 中本地 Promise 相關(guān)聯(lián)的回調(diào)函數(shù)。

需要注意的是計(jì)時(shí)器、I/O、檢查和關(guān)閉隊(duì)列都屬于 libuv。然而,兩個(gè)微任務(wù)隊(duì)列并不屬于 libuv。盡管如此,它們?nèi)匀皇?Node 運(yùn)行時(shí)環(huán)境中扮演著重要角色,并且在執(zhí)行回調(diào)順序方面發(fā)揮著重要作用。說(shuō)到這里, 讓我們來(lái)理解一下事件循環(huán)是如何工作的。

事件循環(huán)是如何工作的?

圖中箭頭是一個(gè)提示,但可能還不太容易理解。讓我來(lái)解釋一下隊(duì)列的優(yōu)先級(jí)順序。首先要知道,所有用戶編寫的同步 JavaScript 代碼都比異步代碼優(yōu)先級(jí)更高。這表示只有在調(diào)用堆棧為空時(shí),事件循環(huán)才會(huì)發(fā)揮作用。

在事件循環(huán)中,執(zhí)行順序遵循某些規(guī)則。需要掌握的規(guī)則還是有一些的,我們逐個(gè)的了解一下:

  1. 執(zhí)行微任務(wù)隊(duì)列(microtask queue)中的所有回調(diào)函數(shù)。首先是 nextTick 隊(duì)列中的任務(wù),然后是 Promise 隊(duì)列中的任務(wù)。
  2. 執(zhí)行計(jì)時(shí)器隊(duì)列(timer queue)內(nèi)的所有回調(diào)函數(shù)。
  3. 如果微任務(wù)隊(duì)列中存在回調(diào)函數(shù),則在計(jì)時(shí)器隊(duì)列內(nèi)每執(zhí)行完一次回調(diào)函數(shù)之后執(zhí)行微任務(wù)隊(duì)列中的所有回調(diào)函數(shù)。首先是 nextTick 隊(duì)列中的任務(wù),然后是 Promise 隊(duì)列中的任務(wù)。
  4. 執(zhí)行 I/O 隊(duì)列(I/O queue)內(nèi)的所有回調(diào)函數(shù)。
  5. 如果微任務(wù)隊(duì)列中存在回調(diào)函數(shù),按照先 nextTick 隊(duì)列后 Promise 隊(duì)列的順序依次執(zhí)行微任務(wù)隊(duì)列中的所有回調(diào)函數(shù)。
  6. 執(zhí)行檢查隊(duì)列(check queue)內(nèi)的所有回調(diào)函數(shù)。
  7. 如果微任務(wù)隊(duì)列中存在回調(diào)函數(shù),則在檢查隊(duì)列內(nèi)每個(gè)回調(diào)之后執(zhí)行微任務(wù)隊(duì)列中的所有回調(diào)函數(shù) 。首先是 nextTick 隊(duì)列中的任務(wù),然后是 Promise 隊(duì)列中的任務(wù)。
  8. 執(zhí)行關(guān)閉隊(duì)列(close queue)內(nèi)的所有回調(diào)函數(shù)。
  9. 在同一循環(huán)的最后,再執(zhí)行一次微任務(wù)隊(duì)列。首先是 nextTick 隊(duì)列中的任務(wù),然后是 Promise 隊(duì)列中的任務(wù)。

此時(shí),如果還有更多的回調(diào)需要處理,那么事件循環(huán)再運(yùn)行一次(譯注:事件循環(huán)在程序運(yùn)行期間一直在運(yùn)行,在當(dāng)前沒(méi)有可供處理的任務(wù)情況下,會(huì)處于等待狀態(tài),一旦有新任務(wù)就會(huì)執(zhí)行),并重復(fù)相同的步驟。另一方面,如果所有回調(diào)都已執(zhí)行并且沒(méi)有更多代碼要處理(譯注:也就是程序執(zhí)行結(jié)束),則事件循環(huán)退出。

這就是 libuv 事件循環(huán)在 Node.js 中執(zhí)行異步代碼的作用。有了這些規(guī)則,我們可以重新審視之前提出的問(wèn)題。


當(dāng)一個(gè)異步任務(wù)在 libuv 中完成時(shí),什么時(shí)候 Node 會(huì)在調(diào)用棧上運(yùn)行相關(guān)聯(lián)的回調(diào)函數(shù)?

答案:只有當(dāng)調(diào)用棧為空時(shí)才執(zhí)行回調(diào)函數(shù)。

Node 是否會(huì)等待調(diào)用棧為空后再運(yùn)行回調(diào)函數(shù)?還是打斷正常執(zhí)行流來(lái)運(yùn)行回調(diào)函數(shù)?

答案:運(yùn)行回調(diào)函數(shù)時(shí)不會(huì)打斷正常執(zhí)行流。

setTimeoutsetIntervalDeuxièmement, il existe une file d'attente d'E/S (I/O queue), qui contient des fonctions de rappel liées à toutes les méthodes asynchrones, telles que fs et http modules Méthodes associées fournies dans . La troisième est la file d'attente de vérification, qui contient la fonction de rappel liée à la fonction setImmediate, qui est une fonction spécifique au n?ud.

Le quatrième est la file d'attente de fermeture, qui enregistre la fonction de rappel associée à l'événement de fermeture de tache asynchrone. ??Enfin, il existe deux files d'attente différentes formant la file d'attente des microtaches. La file d'attente ??????nextTick enregistre la fonction de rappel associée à la fonction process.nextTick. ??La file d'attente Promise stocke les fonctions de rappel associées à la Promise locale en JavaScript. ??Il convient de noter que les minuteries, les E/S, les files d'attente de vérification et de fermeture appartiennent tous à libuv. Cependant, les deux files d'attente de microtaches n'appartiennent pas à libuv. Néanmoins, ils jouent toujours un r?le important dans l'environnement d'exécution de Node et jouent un r?le important dans l'ordre dans lequel les rappels sont exécutés. Cela dit, comprenons comment fonctionne la boucle d’événements. ??

??Comment fonctionne la boucle d'événements?? ??????La flèche sur l'image est un indice, mais elle n'est peut-être pas facile à comprendre. Laissez-moi vous expliquer l'ordre de priorité de la file d'attente. La première chose à savoir est que tout le code JavaScript synchrone écrit par l’utilisateur a priorité sur le code asynchrone. Cela signifie que la boucle d'événements ne fonctionne que lorsque la pile d'appels est vide. ????Dans la boucle événementielle, l'ordre d'exécution suit certaines règles. Il reste encore quelques règles à ma?triser. Examinons-les une par une?: ??
    ??Exécutez toutes les fonctions de rappel dans la file d'attente des microtaches. D’abord les taches de la file d’attente nextTick, puis les taches de la file d’attente Promise. ??Exécutez toutes les fonctions de rappel dans la file d'attente du minuteur. ??S'il y a une fonction de rappel dans la file d'attente des microtaches, toutes les fonctions de rappel dans la file d'attente des microtaches seront exécutées après l'exécution de chaque fonction de rappel dans la file d'attente du minuteur??. D’abord les taches de la file d’attente nextTick, puis les taches de la file d’attente Promise. ??Exécutez toutes les fonctions de rappel dans la file d'attente d'E/S. ??S'il y a des fonctions de rappel dans la file d'attente des microtaches, toutes les fonctions de rappel dans la file d'attente des microtaches seront exécutées séquentiellement dans l'ordre de la file d'attente nextTick puis de la file d'attente Promise. ??Exécutez toutes les fonctions de rappel dans la file d'attente de vérification. ??S'il y a une fonction de rappel dans la file d'attente des microtaches, toutes les fonctions de rappel dans la file d'attente des microtaches seront exécutées après ??vérification de chaque rappel dans la file d'attente. D’abord les taches de la file d’attente nextTick, puis les taches de la file d’attente Promise. ??Exécutez toutes les fonctions de rappel dans la file d'attente de fermeture. ??à la fin de la même boucle, exécutez à nouveau la file d'attente des microtaches. D’abord les taches de la file d’attente nextTick, puis les taches de la file d’attente Promise.
??à ce stade, s'il y a plus de rappels à traiter, la boucle d'événements s'exécutera à nouveau (Annotation?: la boucle d'événements continue de s'exécuter pendant que le programme est en cours d'exécution, et il n'y a actuellement aucune tache à traiter Ensuite, il sera en attente et sera exécuté dès qu'il y aura une nouvelle tache), et répétez les mêmes étapes. En revanche, si tous les rappels ont été exécutés et qu'il n'y a plus de code à traiter, la boucle d'événements se termine. ????C'est ce que fait la boucle d'événements libuv pour exécuter du code asynchrone dans Node.js. Avec ces règles en main, nous pouvons revenir sur les questions que nous avons posées plus t?t. ??
????Lorsqu'une tache asynchrone est terminée dans libuv, quand Node exécutera-t-il la fonction de rappel associée sur la pile d'appels?? ??????Réponse?: La fonction de rappel n'est exécutée que lorsque la pile d'appels est vide. ?????? Node attendra-t-il que la pile d'appels soit vide avant d'exécuter la fonction de rappel?? Ou interrompre le flux d'exécution normal pour exécuter la fonction de rappel?? ??????Réponse?:L'exécution d'une fonction de rappel n'interrompt pas le flux normal d'exécution. ??????Méthodes comme setTimeout et setInterval qui retardent l'exécution des fonctions de rappel. Quand la fonction de rappel sera-t-elle exécutée?? ????

Réponse?: setTimeout et setInterval sont exécutés avec la première priorité parmi toutes les fonctions de rappel (quelle que soit la file d'attente des microtaches). setTimeoutsetInterval 的所有回調(diào)函數(shù)中第一優(yōu)先級(jí)執(zhí)行的(不考慮微任務(wù)隊(duì)列)。

如果兩個(gè)異步任務(wù)(例如 setTimeoutreadFile

Si deux taches asynchrones (telles que setTimeout et readFile) se terminent en même temps, comment Node décide-t-il quelle fonction de rappel est exécutée en premier dans la pile d'appels?? L’un aura-t-il une priorité plus élevée que l’autre ?

Réponse?:
En cas d'achèvement simultané, le rappel du timer sera exécuté avant le rappel des E/S.

Parlons de la boucle dévénements dans NodeNous avons beaucoup appris jusqu'à présent, mais j'espère que vous pourrez garder à l'esprit la séquence d'exécution présentée dans l'image ci-dessous, car elle montre complètement comment Node.js exécute du code asynchrone dans les coulisses.

Mais vous vous demandez peut-être?: "Où est le code pour vérifier cette visualisation??". Eh bien, chaque file d'attente dans la boucle d'événements a des nuances d'implémentation, nous ferions donc mieux d'en parler une par une. Cet article est le premier d'une série sur la boucle d'événements Node.js. Assurez-vous de consulter le lien à la fin de l'article pour comprendre les détails de l'opération dans chaque file d'attente. Même si vous avez une profonde impression en tête maintenant, vous risquez encore de tomber dans certains pièges lorsque vous arrivez au scénario spécifique. .

Conclusion

Ce guide visuel couvre les bases de la programmation asynchrone en JavaScript, le runtime Node.js et libuv, qui gère les opérations asynchrones. Grace à ces connaissances, vous pouvez créer un modèle de boucle d'événements puissant qui sera utile lors de l'écriture de code tirant parti de la nature asynchrone de Node.js.

Pour plus de connaissances sur les n?uds, veuillez visiter?: ??tutoriel Nodejs???! ??

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefa?on, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1502
276
PHP et Vue : une combinaison parfaite d'outils de développement front-end PHP et Vue : une combinaison parfaite d'outils de développement front-end Mar 16, 2024 pm 12:09 PM

PHP et Vue : une combinaison parfaite d'outils de développement front-end à l'ère actuelle de développement rapide d'Internet, le développement front-end est devenu de plus en plus important. Alors que les utilisateurs ont des exigences de plus en plus élevées en matière d’expérience des sites Web et des applications, les développeurs front-end doivent utiliser des outils plus efficaces et plus flexibles pour créer des interfaces réactives et interactives. En tant que deux technologies importantes dans le domaine du développement front-end, PHP et Vue.js peuvent être considérés comme une arme parfaite lorsqu'ils sont associés. Cet article explorera la combinaison de PHP et Vue, ainsi que des exemples de code détaillés pour aider les lecteurs à mieux comprendre et appliquer ces deux éléments.

Tutoriel JavaScript simple?:?Comment obtenir le code d'état HTTP Tutoriel JavaScript simple?:?Comment obtenir le code d'état HTTP Jan 05, 2024 pm 06:08 PM

Tutoriel JavaScript : Comment obtenir le code d'état HTTP, des exemples de code spécifiques sont requis Préface : Dans le développement Web, l'interaction des données avec le serveur est souvent impliquée. Lors de la communication avec le serveur, nous devons souvent obtenir le code d'état HTTP renvoyé pour déterminer si l'opération a réussi et effectuer le traitement correspondant en fonction de différents codes d'état. Cet article vous apprendra comment utiliser JavaScript pour obtenir des codes d'état HTTP et fournira quelques exemples de codes pratiques. Utilisation de XMLHttpRequest

Explorer la technologie front-end du langage Go?: une nouvelle vision du développement front-end Explorer la technologie front-end du langage Go?: une nouvelle vision du développement front-end Mar 28, 2024 pm 01:06 PM

En tant que langage de programmation rapide et efficace, le langage Go est très populaire dans le domaine du développement back-end. Cependant, peu de gens associent le langage Go au développement front-end. En fait, l’utilisation du langage Go pour le développement front-end peut non seulement améliorer l’efficacité, mais également ouvrir de nouveaux horizons aux développeurs. Cet article explorera la possibilité d'utiliser le langage Go pour le développement front-end et fournira des exemples de code spécifiques pour aider les lecteurs à mieux comprendre ce domaine. Dans le développement front-end traditionnel, JavaScript, HTML et CSS sont souvent utilisés pour créer des interfaces utilisateur.

Django est-il front-end ou back-end ? Vérifiez-le! Django est-il front-end ou back-end ? Vérifiez-le! Jan 19, 2024 am 08:37 AM

Django est un framework d'application Web écrit en Python qui met l'accent sur un développement rapide et des méthodes propres. Bien que Django soit un framework Web, pour répondre à la question de savoir si Django est un front-end ou un back-end, vous devez avoir une compréhension approfondie des concepts de front-end et de back-end. Le front-end fait référence à l'interface avec laquelle les utilisateurs interagissent directement, et le back-end fait référence aux programmes c?té serveur. Ils interagissent avec les données via le protocole HTTP. Lorsque le front-end et le back-end sont séparés, les programmes front-end et back-end peuvent être développés indépendamment pour mettre en ?uvre respectivement la logique métier et les effets interactifs, ainsi que l'échange de données.

Questions fréquemment posées par les enquêteurs front-end Questions fréquemment posées par les enquêteurs front-end Mar 19, 2024 pm 02:24 PM

Lors des entretiens de développement front-end, les questions courantes couvrent un large éventail de sujets, notamment les bases HTML/CSS, les bases JavaScript, les frameworks et les bibliothèques, l'expérience du projet, les algorithmes et les structures de données, l'optimisation des performances, les requêtes inter-domaines, l'ingénierie front-end, les modèles de conception et les nouvelles technologies et tendances. Les questions de l'intervieweur sont con?ues pour évaluer les compétences techniques du candidat, son expérience en matière de projet et sa compréhension des tendances du secteur. Par conséquent, les candidats doivent être parfaitement préparés dans ces domaines pour démontrer leurs capacités et leur expertise.

Django : Un framework magique capable de gérer à la fois le développement front-end et back-end ! Django : Un framework magique capable de gérer à la fois le développement front-end et back-end ! Jan 19, 2024 am 08:52 AM

Django : Un framework magique capable de gérer à la fois le développement front-end et back-end ! Django est un framework d'application Web efficace et évolutif. Il est capable de prendre en charge plusieurs modèles de développement Web, notamment MVC et MTV, et peut facilement développer des applications Web de haute qualité. Django prend non seulement en charge le développement back-end, mais peut également créer rapidement des interfaces frontales et obtenir un affichage de vue flexible via un langage de modèle. Django combine le développement front-end et le développement back-end dans une intégration transparente, afin que les développeurs n'aient pas à se spécialiser dans l'apprentissage.

Combinaison de Golang et de technologie front-end?: découvrez comment Golang joue un r?le dans le domaine front-end Combinaison de Golang et de technologie front-end?: découvrez comment Golang joue un r?le dans le domaine front-end Mar 19, 2024 pm 06:15 PM

Combinaison de Golang et de la technologie front-end?: pour explorer le r?le de Golang dans le domaine front-end, des exemples de code spécifiques sont nécessaires. Avec le développement rapide d'Internet et des applications mobiles, la technologie front-end est devenue de plus en plus importante. Dans ce domaine, Golang, en tant que puissant langage de programmation back-end, peut également jouer un r?le important. Cet article explorera comment Golang est combiné avec la technologie front-end et démontrera son potentiel dans le domaine front-end à travers des exemples de code spécifiques. Le r?le de Golang dans le domaine front-end est celui d'un outil efficace, concis et facile à apprendre.

Comprendre la fonction principale de React: la perspective du frontend Comprendre la fonction principale de React: la perspective du frontend Apr 18, 2025 am 12:15 AM

Les principales fonctions de React incluent la pensée composante, la gestion de l'état et le DOM virtuel. 1) L'idée de la composante permet de diviser l'interface utilisateur en parties réutilisables pour améliorer la lisibilité et la maintenabilité du code. 2) La gestion de l'état gère les données dynamiques via l'état et les accessoires, et les modifications déclenchent des mises à jour de l'interface utilisateur. 3) Performances d'optimisation virtuelle DOM, mettez à jour l'interface utilisateur à travers le calcul du fonctionnement minimum de la réplique DOM en mémoire.

See all articles