详解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 相关文章推荐
让IE8支持DOM 2(不用框架!)
Dec 31 Javascript
jquery中获取select选中值的代码
Jun 27 Javascript
php对mongodb的扩展(小试牛刀)
Nov 11 Javascript
JavaScript检查某个function是否是原生代码的方法
Aug 20 Javascript
javascript监听页面刷新和页面关闭事件方法详解
Jan 09 Javascript
JS实现快速比较两个字符串中包含有相同数字的方法
Sep 11 Javascript
微信小程序实现的一键连接wifi功能示例
Apr 24 Javascript
js实现坦克移动小游戏
Oct 28 Javascript
微信小程序商品详情页底部弹出框
Nov 22 Javascript
基于Vue的侧边目录组件的实现
Feb 05 Javascript
JS如何实现手机端输入验证码效果
May 13 Javascript
解决echarts echarts数据动态更新和dataZoom被重置问题
Jul 20 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
ucenter通信原理分析
2015/01/09 PHP
thinkphp 手机号和用户名同时登录
2017/01/20 PHP
Laravel框架实现的使用smtp发送邮件功能示例
2019/03/12 PHP
jQuery 获取对象 根据属性、内容匹配, 还有表单元素匹配
2010/05/31 Javascript
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
使用JavaScript获取电池状态的方法
2014/05/03 Javascript
Javascript中arguments对象详解
2014/10/22 Javascript
jQuery添加options点击事件并传值实例代码
2016/05/18 Javascript
jQuery.ajax向后台传递数组问题的解决方法
2017/05/12 jQuery
JavaScript插件Tab选项卡效果
2017/11/14 Javascript
使用3D引擎threeJS实现星空粒子移动效果
2020/09/13 Javascript
使用Vue组件实现一个简单弹窗效果
2018/04/23 Javascript
基于Vue实现拖拽功能
2020/07/29 Javascript
JavaScript禁用右键单击优缺点分析
2019/01/20 Javascript
Vue的H5页面唤起支付宝支付功能
2019/04/18 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
微信小程序实现简单的select下拉框
2020/11/23 Javascript
基于wxpython实现的windows GUI程序实例
2015/05/30 Python
python实现稀疏矩阵示例代码
2017/06/09 Python
利用Python批量提取Win10锁屏壁纸实战教程
2018/03/27 Python
Python3匿名函数用法示例
2018/07/25 Python
Python缓存技术实现过程详解
2019/09/25 Python
Python的几种主动结束程序方式
2019/11/22 Python
解决tensorflow添加ptb库的问题
2020/02/10 Python
OpenCV+Python3.5 简易手势识别的实现
2020/12/21 Python
金宝贝童装官网:Gymboree
2016/08/31 全球购物
严选全球尖货,立足香港:Bonpont宝盆
2018/07/24 全球购物
时尚孕妇装:Ingrid & Isabel
2019/05/08 全球购物
香奈儿美国官网:CHANEL美国
2020/05/20 全球购物
Linux操作面试题
2012/05/16 面试题
校园活动策划书范文
2014/01/10 职场文书
启动仪式策划方案
2014/06/14 职场文书
解除劳动关系协议书2篇
2014/11/28 职场文书
2015年度团总支工作总结
2015/04/23 职场文书
《神奇的鸟岛》教学反思
2016/02/22 职场文书
Hive导入csv文件示例
2022/06/25 数据库