1、函数非异步执行顺序
function A(){};
function B(){};
function C(){}:
2、函数使用Immediate 方法
function A(){};
setImmediate(B(){});
function C(){}:
3、使用process.nextTick();
function 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