nodejs 非异步I/O API

来源:互联网 发布:淘宝云客服怎么报名 编辑:程序博客网 时间:2024/05/16 13:53

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 eventthis is nextTickthis is setTimeoutthis is immediate
0 0
原创粉丝点击