nodejs 非异步I/O API

本文介绍了Node.js中非异步I/O函数的执行顺序,包括函数直接调用、使用`setImmediate()`和`process.nextTick()`的情况。详细解析了Node.js事件的执行过程,分为异步调用、线程池执行和事件循环三个步骤。同时,对比了`process.nextTick()`和`setImmediate()`在事件循环中的不同优先级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、函数非异步执行顺序
function A(){};
function B(){};
function C(){}:
A();B();C();

2、函数使用Immediate 方法
function A(){};
setImmediate(B(){});
function C(){}:
A();setImmediate(B(){});C();

3、使用process.nextTick();
function A(){};
process.nextTick(B(){});
C();
A();process.nextTick(B(){});C();

执行顺序:
process.nextTick() > setImmediate();

process.nextTick(function () {
    console.log("this is nextTick");
});

setImmediate(function () {
    console.log("this is immediate");
    setImmediate(function () {
        console.log("this is 2immediate");
    });
    process.nextTick(function () {
       console.log("this is 2nextTick");
    });
});
console.log("this is event");
//结果
this is event;
this is nextTick;
this is immediate;
this is 2nextTick;
this is 2immediate;

在nodejs中 事件的执行过程大概分三个步骤

1、异步调用 即是最开始的发起异步 例如fs.open(),执行fs.open 之后 ,node 将会封装这个请求对象,并将这个请求对象放进线程池
2、 线程池 线程池收到这个请求 并且当前有线程可用 ,于是执行请求对象。将执行完成的结果放在请求对象中,然后将请求对象交给事件循环的观察者。然后回收线程。
3、事件循环 这是node本身维持的一个循环队列,从观察者取到可用的请求对象 然后执行回调函数。

process.nextTick(),setImmediate() 和setTimeout()以及 setInterval 都是属于最后一步 事件循环 。区别在于
process.nextTick() 属于 idle观察者
setImmediate() 属于 check 观察者
在同一级中 idle观察者优先级 >io观察者优先级> check观察者优先级

示例

process.nextTick(function () {
    console.log("this is nextTick");
});

setImmediate(function () {
    console.log("this is immediate");
});
setTimeout(function () {
    console.log("this is setTimeout")
},0);
console.log("this is I/O event");
//结果
this is I/O event
this is nextTick
this is setTimeout
this is immediate
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值