详解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 ajax 用户无刷新登录方法详解
Apr 28 Javascript
图片翻转效果具体实现代码
Jan 09 Javascript
加载列表时jquery获取ul中第一个li的属性
Nov 02 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
Mar 30 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
Oct 19 Javascript
JS与jQuery遍历Table所有单元格内容的方法
Dec 07 Javascript
JavaScript知识点总结(十一)之js中的Object类详解
May 31 Javascript
基于JavaScript实现数码时钟效果
Mar 30 Javascript
node跨域请求方法小结
Aug 25 Javascript
AngularJS实现的select二级联动下拉菜单功能示例
Oct 25 Javascript
JS实现读取xml内容并输出到div中的方法示例
Apr 19 Javascript
Node错误处理笔记之挖坑系列教程
Jun 05 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多用户读写文件冲突的解决办法
2013/11/06 PHP
php中\r \r\n \t的区别示例介绍
2014/02/08 PHP
YII分模块加载路由的实现方法
2018/10/01 PHP
PHP+RabbitMQ实现消息队列的完整代码
2019/03/20 PHP
DOM Scripting中的图片切换[兼容Firefox]
2010/06/12 Javascript
JQuery入门——事件切换之hover()方法应用介绍
2013/02/05 Javascript
在JavaScript中操作时间之getMonth()方法的使用
2015/06/10 Javascript
Nodejs express框架一个工程中同时使用ejs模版和jade模版
2015/12/28 NodeJs
Angularjs中使用Filters详解
2016/03/11 Javascript
使用jQuery实现Web页面换肤功能的要点解析
2016/05/12 Javascript
js监听input输入框值的实时变化实例
2017/01/26 Javascript
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
Angularjs上传文件组件flowjs功能
2017/08/07 Javascript
react实现菜单权限控制的方法
2017/12/11 Javascript
JS实现的base64加密解密操作示例
2018/04/18 Javascript
vue模式history下在iis中配置流程
2019/04/17 Javascript
jQuery实现高级检索功能
2019/05/28 jQuery
bootstrap table插件动态加载表头
2019/07/19 Javascript
在Python中使用NLTK库实现对词干的提取的教程
2015/04/08 Python
python框架django基础指南
2016/09/08 Python
python通过opencv实现批量剪切图片
2017/11/13 Python
selenium+python自动化测试环境搭建步骤
2019/06/03 Python
Python 数据可视化pyecharts的使用详解
2019/06/26 Python
python 字符串常用方法汇总详解
2019/09/16 Python
python并发爬虫实用工具tomorrow实用解析
2019/09/25 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
2020/06/04 Python
python输出国际象棋棋盘的实例分享
2020/11/26 Python
使用Python下载抖音各大V视频的思路详解
2021/02/06 Python
通过一张图教会你CSS3倒影的实现
2017/09/26 HTML / CSS
基于HTML5代码实现折叠菜单附源码下载
2015/11/27 HTML / CSS
使用HTML5 Geolocation实现一个距离追踪器
2018/04/09 HTML / CSS
入党积极分子思想汇报
2014/01/02 职场文书
银行中层干部培训心得体会
2016/01/11 职场文书
go语言基础 seek光标位置os包的使用
2021/05/09 Golang
MySQL中order by的使用详情
2021/11/17 MySQL
python单向链表实例详解
2022/05/25 Python