前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nodejs进程对象process的nextTick方法应用场景

nodejs进程对象process的nextTick方法应用场景

作者头像
前端_AWhile
发布2019-08-29 13:09:00
1.5K0
发布2019-08-29 13:09:00
举报
文章被收录于专栏:前端一会前端一会

在nodejs中只支持单线程。在操作系统中,每个应用程序都是一个进程类的实例对象。在nodejs中,就是使用process对象来代表nodejs应用程序。

process对象是一个全局对象,具有一些可被用来获取nodejs应用程序以及运行该应用程序的用户、运行环境的各种信息的属性、方法和事件。

可以在nodejs的REPL环境中或任何模块中访问process对象。

可以将process对象称为进程对象,即nodejs进程对象。

process对象的方法很多,例如process.memoryUsage()、nextTick方法、abort方法、process.chdir()方法、cwd方法、exit方法等等…

那些方法详细的可以看下API文档,用起来很简单,需要重点关注的是nextTick方法。

process.nextTick( callback )方法用于将一个函数推迟到代码中所书写的下一个同步方法执行完毕时或异步方法的事件回调函数开始执行时调用,该方法中使用一个参数,参数值是被推迟的函数。

为初步理解上面这段话的含义,给出一个如下正常使用异步的程序看下打印结果:

function foo() {
    console.log( "bar" );
};

setTimeout( foo, 0 );
console.log( "fn" );
// 打印:
// fn
// bar

使用process.nextTick()方法来执行foo函数:

function foo() {
    console.log( "bar" );
};

process.nextTick( foo );
console.log( "fn" );
// 打印:
// fn
// bar

process.nextTick( callback )方法中的参数值为需要推荐执行的函数,这个函数的执行顺序是在同步方法都执行完毕后,放在下一个事件循环中的开始执行的。并且该方法的执行速度大大快于使用setTimeout方法。

function foo() {
    console.log( "bar" );
};
setTimeout( function () {
    console.log( "2555" );
}, 0 )
process.nextTick( foo );
console.log( "fn" );
console.log( "111" );
// 打印结果:nextTick()方法在所有同步方法都执行完后的异步顺序中最先执行
/*
fn
111
bar
2555
*/

下面看几个process.nextTick()方法的重要使用场景。

使用nextTick()指定一个函数在一个同步方法执行完毕时立即被调用:

const fs = require( "fs" );
function foo() {
    console.log( "文件读取完毕" );
}
process.nextTick( foo );
// 同步方法读文件
console.log( fs.readFileSync( "./a.txt", "utf8" ).toString() );
/*
你好!
文件读取完毕
*/

使用nextTick()方法指定两个耗时操作同时进行:

const fs = require( "fs" );
function foo() {
    // 另一个读取相同mp3文件任务
    function beginAnotherTask() {
        let anotherFile = fs.createReadStream( "./ipx.mp3" );
        anotherFile.on( "data", function ( dataChunk ) {
            console.log( "读取到%d字节", dataChunk.length );
        } )
    }
    process.nextTick( beginAnotherTask );
}
// 定义一个读取mp3文件的任务
let file = fs.createReadStream( "./ipx.mp3" );
file.on( "data", function ( dataChunk ) {
    console.log( "从ipx.mp3文件中读取到%d字节", dataChunk.length );
} )

// 执行另一个读取的任务
foo();

上例原理是nextTick方法可用来将一个函数推迟到代码中所编写的下一个异步方法的事件回调函数开始执行时调用。

另外,nextTick方法还可以实现递归:

process.nextTick( function foo(){
    // 其他代码略
    process.nextTick( foo );
} )

参考资料:

1. 《Node.js》权威指南 - 第9章 - 9.1小节 nodejs中的进程

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端小二 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档