详解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 相关文章推荐
IE中createElement需要注意的一个问题
Jul 13 Javascript
javascript弹出层输入框(示例代码)
Dec 11 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
May 01 Javascript
jquery模拟进度条实现方法
Aug 03 Javascript
javascript获取本机操作系统类型的方法
Aug 13 Javascript
jquery 动态增加,减少input表单的简单方法(必看)
Oct 12 Javascript
解析利用javascript如何判断一个数为素数
Dec 08 Javascript
MUI  Scroll插件的使用详解
Apr 13 Javascript
VUE预渲染及遇到的坑
Sep 03 Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
Sep 07 Javascript
利用js-cookie实现前端设置缓存数据定时失效
Jun 18 Javascript
Vue父组件向子组件传值以及data和props的区别详解
Mar 02 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
带你了解PHP7 性能翻倍的关键
2015/11/19 PHP
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
JS类中定义原型方法的两种实现的区别
2007/03/08 Javascript
解决 firefox 不支持 document.all的方法
2007/03/12 Javascript
IE innerHTML,outerHTML所引起的问题
2009/06/04 Javascript
jquery中load方法的用法及注意事项说明
2014/02/22 Javascript
解决jquery版本冲突的有效方法
2014/09/02 Javascript
Javascript实现的Map集合工具类完整实例
2015/07/31 Javascript
zTree插件下拉树使用入门教程
2016/04/11 Javascript
Google 地图叠加层实例讲解
2016/08/06 Javascript
Jquery 整理元素选取、常用方法一览表
2016/11/26 Javascript
JS的函数调用栈stack size的计算方法
2018/06/24 Javascript
vue使用axios上传文件(FormData)的方法
2019/04/14 Javascript
基于Vue+ElementUI的省市区地址选择通用组件
2019/11/20 Javascript
微信小程序修改checkbox的样式代码实例
2020/01/21 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
2020/02/27 Javascript
nodeJs项目在阿里云的简单部署
2020/11/27 NodeJs
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
Python字符串匹配算法KMP实例
2015/07/18 Python
分享Pycharm中一些不为人知的技巧
2018/04/03 Python
python turtle库画一个方格和圆实例
2019/06/27 Python
pybind11在Windows下的使用教程
2019/07/04 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
2019/08/13 Python
PyCharm导入python项目并配置虚拟环境的教程详解
2019/10/13 Python
手动安装python3.6的操作过程详解
2020/01/13 Python
Python 判断时间是否在时间区间内的实例
2020/05/16 Python
阿迪达斯印度官方商城:adidas India
2017/03/26 全球购物
波兰最大的儿童服装连锁店之一:5.10.15.
2018/02/11 全球购物
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
Notino法国:购买香水和化妆品
2019/04/15 全球购物
优秀党员主要事迹
2014/01/19 职场文书
校外活动方案
2014/08/28 职场文书
2014年检察院个人工作总结
2014/12/09 职场文书
2016党员干部廉洁自律心得体会
2016/01/13 职场文书
Win10 最新稳定版本 21H2开始推送
2022/04/19 数码科技