详解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 相关文章推荐
一个js封装的不错的选项卡效果代码
Feb 15 Javascript
js加解密 脚本解密
Feb 22 Javascript
S2SH整合JQuery+Ajax实现登录验证功能实现代码
Jan 30 Javascript
JS根据变量保存方法名并执行方法示例
Apr 04 Javascript
javascript中的Function.prototye.bind
Jun 25 Javascript
javascript中setAttribute()函数使用方法及兼容性
Jul 19 Javascript
基于Node.js的JavaScript项目构建工具gulp的使用教程
May 20 Javascript
JavaScript实现复制文章自动添加版权
Aug 02 Javascript
深入理解JS DOM事件机制
Aug 06 Javascript
js仿腾讯QQ的web登陆界面
Aug 19 Javascript
详解layui弹窗父子窗口之间传参数的方法
Jan 16 Javascript
vue router 源码概览案例分析
Oct 09 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
SONY ICF-F10中波修复记
2021/03/02 无线电
php学习之流程控制实现代码
2011/06/09 PHP
分享ThinkPHP3.2中关联查询解决思路
2015/09/20 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
PHP操作Redis常用技巧总结
2018/04/24 PHP
js小技巧--自动隐藏红叉叉
2007/08/13 Javascript
关于hashchangebroker和statehashable的补充文档
2011/08/08 Javascript
js鼠标滑过图片震动特效的方法
2015/02/17 Javascript
js操作数组函数实例小结
2015/12/10 Javascript
JQuery日历插件My97DatePicker日期范围限制
2016/01/20 Javascript
AngularJs  Creating Services详解及示例代码
2016/09/02 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
vue.js组件之间传递数据的方法
2017/07/10 Javascript
JavaScript实现各种排序的代码详解
2017/08/28 Javascript
vue2单元测试环境搭建
2018/05/24 Javascript
vue2.0项目实现路由跳转的方法详解
2018/06/21 Javascript
JS动态图片的实现方法完整示例
2020/01/13 Javascript
从0到1学习JavaScript编写贪吃蛇游戏
2020/07/28 Javascript
Python排序搜索基本算法之冒泡排序实例分析
2017/12/09 Python
django连接mysql配置方法总结(推荐)
2018/08/18 Python
python粘包问题及socket套接字编程详解
2019/06/29 Python
python 绘制拟合曲线并加指定点标识的实现
2019/07/10 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
2020/01/04 Python
Python通过socketserver处理多个链接
2020/03/18 Python
Python环境下安装PyGame和PyOpenGL的方法
2020/03/25 Python
利用CSS3的border-radius绘制太极及爱心图案示例
2016/05/17 HTML / CSS
Erwin Müller穆勒家居瑞士官网:您整个家庭的邮购公司
2019/12/28 全球购物
西班牙在线药店:DosFarma
2020/03/28 全球购物
小学教师自我鉴定
2013/11/07 职场文书
旷课检讨书3000字
2014/02/04 职场文书
怀念母亲教学反思
2014/04/28 职场文书
学校安全管理责任书
2014/07/23 职场文书
学习礼仪心得体会
2014/09/01 职场文书
地雷战观后感
2015/06/09 职场文书
使用Springboot实现健身房管理系统
2021/07/01 Java/Android
Python中使用tkFileDialog实现文件选择、保存和路径选择
2022/05/20 Python