详解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 相关文章推荐
破除一些网站复制、右键限制
Nov 04 Javascript
javascript StringBuilder类实现
Dec 22 Javascript
基于jquery 的一个progressbar widge
Oct 29 Javascript
JQuery实现绚丽的横向下拉菜单
Dec 19 Javascript
jquery插件开发之实现google+圈子选择功能
Mar 10 Javascript
Three.js基础部分学习
Jan 08 Javascript
JS基于面向对象实现的多个倒计时器功能示例
Feb 28 Javascript
Express系列之multer上传的使用
Oct 27 Javascript
浅谈angular4实际项目搭建总结
Dec 01 Javascript
讲解vue-router之什么是嵌套路由
May 28 Javascript
angularjs1.5 组件内用函数向外传值的实例
Sep 30 Javascript
微信小程序实现时间预约功能
Nov 27 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
通过ODBC连接的SQL SERVER实例
2006/10/09 PHP
深入了解 register_globals (附register_globals=off 网站打不开的解决方法)
2012/06/27 PHP
基于PHP读取csv文件内容的详解
2013/06/18 PHP
C#静态方法与非静态方法实例分析
2014/09/22 PHP
FireFox中textNode分片的问题
2007/04/10 Javascript
使用node.js 制作网站前台后台
2014/11/13 Javascript
jQuery自定义添加"$"与解决"$"冲突的方法
2015/01/19 Javascript
javascript中SetInterval与setTimeout的定时器用法
2015/08/24 Javascript
jQuery实现Tab菜单滚动切换的方法
2015/09/21 Javascript
Javascript技术难点之apply,call与this之间的衔接
2015/12/04 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
JavaScript和jQuery制作光棒效果
2017/02/24 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
2017/03/21 Javascript
JS排序之快速排序详解
2017/04/08 Javascript
浅谈Vue Element中Select下拉框选取值的问题
2018/03/01 Javascript
在Vue环境下利用worker运行interval计时器的步骤
2019/08/01 Javascript
微信小程序云函数使用mysql数据库过程详解
2019/08/07 Javascript
浅谈vue项目用到的mock数据接口的两种方式
2019/10/09 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
2020/02/25 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
python提取内容关键词的方法
2015/03/16 Python
Python随机生成信用卡卡号的实现方法
2015/05/14 Python
在Django的URLconf中使用多个视图前缀的方法
2015/07/18 Python
Python正则表达式匹配中文用法示例
2017/01/17 Python
python 输入一个数n,求n个数求乘或求和的实例
2018/11/13 Python
用pandas划分数据集实现训练集和测试集
2020/07/20 Python
canvas 橡皮筋式线条绘图应用方法
2019/02/13 HTML / CSS
智乐游戏测试笔试题
2014/05/21 面试题
家长会学生演讲稿
2014/04/26 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
婚礼新人答谢词
2015/01/04 职场文书
护士自荐信怎么写
2015/03/06 职场文书
2015年学生会纪检部工作总结
2015/03/31 职场文书
2015年化工厂工作总结
2015/05/04 职场文书
Python matplotlib可视化之绘制韦恩图
2022/02/24 Python
nginx容器方式反向代理实战
2022/04/18 Servers