详解Node.js异步处理的各种写法
异步的“坑”
最近一段时间参与开发了一个node.js后台项目,作为一个php开发者,上手项目本身并不难,但是开发的过程却并不顺利,不顺利的主要原因在于思路上没有转变,没有从 同步 的思维转换到 异步 的思维。
所谓 同步 ,就是程序(线程)在一个任务的处理过程中,不会插入处理其他任务,即使遇到io等不占cpu的操作,也会一直等待其结束才会继续往下处理。
所谓 异步 ,就是程序(线程)在一个任务的处理过程中,会插入处理其他任务,如遇到io操作,当前任务会将程序(线程)的控制权释放给其他任务,等io操作结果返回后再继续往下处理。
众所周知,node.js采用的是单线程的异步模型,在具体代码的写法上自然和php等同步模型不一样。在具体项目开发的过程中,各种异步操作相关的关键字层出不穷,如: .then() 、 function* ... yield 、 async...await 等等。为了写一个 类同步 的操作,比如:“在执行完a步骤拿到结果之后再执行b步骤”这么一个简单的需求,却要经过大量的反复调试验证才能解决。究其原因,就是对于这些异步操作的场景和关键字的含义理解不到位,异步操作所提供的选择太多了。
下面就结合代码实例,理一理这些异步操作的参数具体怎么使用。
异步的各种写法
任务说明:项目根目录下有三个文件 jay.txt 、 angela.txt 、 henry.txt ,依次读取这三个文件的内容并打印。
下面使用各种异步处理的方法来完成此任务。
回调函数
ps:下面看下nodejs 处理异步(获取异步数据并处理)的方法
方法1. 回调函数方式
将异步方法如readfile封装到一个自定义函数中,通过将异步方法得到的结果传给自定义方法的回调函数参数。具体如下(以fs模块的readfile方法为例):
//封装 var func = function(filepath,callback){ fs.readfile(filepath, function(err, data){ if(err){ return false; } callback(data); }) } //调用 func('./a.txt', function(res){ //处理异步方法返回得到的数据 console.log(res); })
方法2. 事件驱动方式
使用node events模块,利用其eventemitter对象广播和接收广播的方式传输异步方法返回的结果。具体如下(仍以fs模块的readfile异步方法为例):
var events = require('events'); var eventemitter = new events.eventemitter(); fs.readfile('./a.txt', function(err, data){ //数据读取后发出readdata信号的广播,并将数据data传出 eventemitter.emit('readdata', data); }) //监听readdata信号,并对监听到的数据做处理(也可先定义监听,再做异步的读取操作) eventemitter.on('readdata', function(res){ //处理异步读取得到的数据 console.log(res); })
总结
以上所述是小编给大家介绍的node.js异步处理的各种写法,希望对大家有所帮助