首页 > 编程语言 >nodejs中事件循环中的执行顺序

nodejs中事件循环中的执行顺序

时间:2022-11-16 12:56:08浏览次数:37  
标签:nextTick 顺序 console log nodejs process 循环 Promise setTimeout

nodejs 事件循环是一个典型的生产者/消费者模型,异步 I/O、网络请求等是事件的生产者,源源不断为 Node 提供不同类型的事件,这些事件被传递到对应的观察者那里,事件循环则从观察者那里取出事件并处理。

事件循环、观察者、请求对象、I/O 线程池共同构成了 Node 异步 I/O 模型的基本要素。

Node 异步 I/O 几个关键词:单线程、事件循环、观察者、I/O 线程池,JavaScript 是单线程,node自身是多线程,只是 I/O 线程使用的 CPU 较少。除了用户代码无法并行执行外,所有的 I/O(磁盘 I/O 和网络 I/O 等)是可以并行起来的。

node 中还存在一些与 I/O 无关的异步 API,setTimeout()、setInteval()、setImmediate()、process.nextTick()

process.nextTick()=> idle 观察者

setImmediate() => check 观察者

事件循环对观察者的检查有先后顺序,idle观察者先于 I/O 观察者,I/O 观察者先于 check 观察者。

const fs = require("fs");
const path = require("path");

const wait = () =>
    new Promise((resolove, reject) => {
        setTimeout(resolove(true), 3);
    });
fs.readFile(
    path.resolve(__dirname, "./limit.js"),
    "utf-8",
    async (err, data) => {
        console.log("读取的文件内容1");
    }
);
fs.readFile(
    path.resolve(__dirname, "./limit.js"),
    "utf-8",
    async (err, data) => {
        console.log("读取的文件内容2");
        await wait();
        console.log("读取文件内容2,等待3 秒后输出");
        process.nextTick(() => {
            console.log("读取文件内容2,等待3 秒后执行 process.nextTick");
        });
    }
);

console.log("start");

setTimeout(function () {
    console.log("setTimeout-1");
    process.nextTick(function () {
        console.log("setTimeout-1-process.nextTick");
    });
    new Promise(function (resolve) {
        console.log("setTimeout-1-Promise");
        resolve();
    }).then(function () {
        console.log("setTimeout-1-Promise-then");
    });
});
setImmediate(() => {
    console.log("setImmediate-1");
    process.nextTick(function () {
        console.log("setImmediate-1-process.nextTick-1");
    });
});
setImmediate(() => {
    console.log("setImmediate-2");
});
process.nextTick(function () {
    console.log("process.nextTick-1");
});
process.nextTick(function () {
    console.log("process.nextTick-2");
});
new Promise(function (resolve) {
    console.log("Promise-1");
    resolve();
}).then(function () {
    console.log("Promise-1-then");
});

setTimeout(function () {
    console.log("setTimeout-2");
    process.nextTick(function () {
        console.log("setTimeout-2-process.nextTick");
    });
    new Promise(function (resolve) {
        console.log("setTimeout-2-Promise");
        resolve();
    }).then(function () {
        console.log("setTimeout-2-Promise-then");
    });
});
// 执行结果
// start
// Promise-1

// 在每轮循环中,会将 process.nextTick 全部执行完,优先级> promise.then
// process.nextTick-1
// process.nextTick-2
// Promise-1-then

// setTimeout timer 优先级> setImmediate check 观察者
// setTimeout-1
// setTimeout-1-Promise
// setTimeout-1-process.nextTick
// setTimeout-1-Promise-then

// setTimeout-2
// setTimeout-2-Promise
// setTimeout-2-process.nextTick
// setTimeout-2-Promise-then

// 一次循环只执行一个 setImmediate
// setImmediate-1
// setImmediate-1-process.nextTick-1
// setImmediate-2

// 读取的文件内容1
// 读取的文件内容2
// 读取文件内容2,等待3 秒后输出
// 读取文件内容2,等待3 秒后执行 process.nextTick

 

标签:nextTick,顺序,console,log,nodejs,process,循环,Promise,setTimeout
From: https://www.cnblogs.com/beileixinqing/p/16895513.html

相关文章

  • Day6-2 数组的使用:for,for-each循环,作为方法参数,作为返回值
    数组的使用普通For循环For-Each循环数组做方法入参数组做返回值 packagecom.kuang.array;​//for-each循环publicclassArrayDemo04{publicstatic......
  • 洛谷题单【入门1】顺序结构-P1001 A+B Problem
    题目描述输入两个整数 a,ba,b,输出它们的和(|a|,|b|\le{10}^9∣a∣,∣b∣≤109)。 输入格式两个以空格分开的整数。输出格式一个整数。输入输出样例输......
  • 洛谷题单【入门1】顺序结构-B2005 字符三角形
    题目描述给定一个字符,用它构造一个底边长 55 个字符,高 33 个字符的等腰字符三角形。输入格式输入只有一行,包含一个字符。输出格式该字符构成的等腰三角形,底......
  • 洛谷题单【入门1】顺序结构-P1000 超级玛丽游戏
    题目描述超级玛丽是一个非常经典的游戏。请你用字符画的形式输出超级玛丽中的一个场景。********************####........
  • python 中 循环结构同时传入多个参数
     001、>>>list1=[("aa",100,400),("bb","kk","yy"),(33,400,500)]>>>fori,j,kinlist1:##利用列表、元组同时传入多个参数...print(i,......
  • 循环
    循环while循环表达式while(布尔表达式){ //循环内容}只要布尔表达式是true就会一直循环下去,大多数情况下我们需要一个让表达式失效的方法do...while循环表达......
  • js闭包问题、js事件循环机制、async与defer、同步与异步模式
    js闭包问题定义:闭包就是有权访问其他函数作用域内的其他变量的函数。实现机制:在访问变量的函数中return一个匿名函数,这时匿名函数的作用域链将指向该函数的作用域。!!!由于......
  • 14.循环
    种类......
  • 循环语句 while
    循环语句whilewhlie语句结构while(表达式)循环语句;//在while循环中,break用于永久的终止循环intmain(){ inti=1; while(i<=10) { if(i==5) ......
  • 彻底搞懂nodejs事件循环
    nodejs是单线程执行的,同时它又是基于事件驱动的非阻塞IO编程模型。这就使得我们不用等待异步操作结果返回,就可以继续往下执行代码。当异步事件触发之后,就会通知主线程,主线......