详解Node.js异步处理的各种写法


Posted in Javascript onJune 09, 2019

异步的“坑”

最近一段时间参与开发了一个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异步处理的各种写法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
基于jQuery的实现简单的分页控件
Oct 10 Javascript
给事件响应函数传参数的四种方式小结
Dec 05 Javascript
jQuery中dom元素上绑定的事件详解
Apr 24 Javascript
js获取页面及个元素高度、宽度的代码
Apr 26 Javascript
jQuery实现base64前台加密解密功能详解
Aug 29 jQuery
用vue快速开发app的脚手架工具
Jun 11 Javascript
解决vue数组中对象属性变化页面不渲染问题
Aug 09 Javascript
jQuery+css last-child实现选择最后一个子元素操作示例
Dec 10 jQuery
利用jsonp解决js读取本地json跨域的问题
Dec 11 Javascript
VUE脚手架具体使用方法
May 20 Javascript
jquery实现点击弹出对话框
Feb 08 jQuery
node.js使用zlib模块进行数据压缩和解压操作示例
Feb 12 Javascript
在mpvue框架中使用Vant WeappUI组件库的注意事项【推进】
Jun 09 #Javascript
微信小程序发布新版本时自动提示用户更新的方法
Jun 07 #Javascript
微信小程序与webview交互实现支付功能
Jun 07 #Javascript
在微信小程序中使用vant的方法
Jun 07 #Javascript
微信小程序实现折线图的示例代码
Jun 07 #Javascript
微信小程序如何刷新当前界面的实现方法
Jun 07 #Javascript
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
Jun 07 #Javascript
You might like
PHP微信红包生成代码分享
2016/10/06 PHP
PHP两种实现无级递归分类的方法
2017/03/02 PHP
PHP利用递归函数实现无限级分类的方法
2019/03/22 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
php解析非标准json、非规范json的方式实例
2020/12/10 PHP
JS JQUERY实现滚动条自动滚到底的方法
2015/01/09 Javascript
详解jQuery中的empty、remove和detach
2016/04/11 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
完美JQuery图片切换效果的简单实现
2016/07/21 Javascript
JavaScript数据类型学习笔记分享
2016/09/01 Javascript
jQuery动态生成表格及右键菜单功能示例
2017/01/13 Javascript
微信小程序实现带刻度尺滑块功能
2017/03/29 Javascript
jQuery EasyUI 组件加上“清除”功能实例详解
2017/04/11 jQuery
Express本地测试HTTPS的示例代码
2018/06/06 Javascript
JavaScript如何把两个数组对象合并过程解析
2019/10/10 Javascript
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
python购物车程序简单代码
2018/04/18 Python
彻底理解Python中的yield关键字
2019/04/01 Python
PyTorch-GPU加速实例
2020/06/23 Python
keras分类之二分类实例(Cat and dog)
2020/07/09 Python
Python实现哲学家就餐问题实例代码
2020/11/09 Python
CSS3 倾斜的网页图片库实例教程
2009/11/14 HTML / CSS
使用html5+css3来实现slider切换效果告别javascript+css
2013/01/08 HTML / CSS
中国领先的专业家电网购平台:国美在线
2016/12/25 全球购物
Bose英国官方网站:美国知名音响品牌
2020/01/26 全球购物
泰国排名第一的家居用品中心:HomePro
2020/11/18 全球购物
Java如何读取CLOB字段
2013/10/10 面试题
中职生自荐信
2013/10/13 职场文书
护士专业推荐信
2013/11/02 职场文书
竞选班长自荐书范文
2014/03/09 职场文书
常务副总经理任命书
2014/06/05 职场文书
2014年全国爱牙日宣传活动方案
2014/09/21 职场文书
安全教育的主题班会
2015/08/13 职场文书
《从现在开始》教学反思
2016/02/16 职场文书
《半截蜡烛》教学反思
2016/02/19 职场文书
Java 实现限流器处理Rest接口请求详解流程
2021/11/02 Java/Android