详解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 相关文章推荐
javascript英文日期(有时间)选择器
May 02 Javascript
Mootools 1.2教程(21)——类(二)
Sep 15 Javascript
javascript真的不难-回顾一下基础知识
Jan 15 Javascript
jquery中常用的函数和属性详细解析
Mar 07 Javascript
jquery插件qrcode在线生成二维码
Apr 26 Javascript
javascript实现密码验证
Nov 10 Javascript
JS数组排序方法实例分析
Dec 16 Javascript
jquery自定义插件结合baiduTemplate.js实现异步刷新(附源码)
Dec 22 Javascript
jQuery自定义插件详解及实例代码
Dec 29 Javascript
JavaScript数据类型的存储方法详解
Aug 25 Javascript
vue自定义一个v-model的实现代码
Jun 21 Javascript
jQuery实现的模仿雨滴下落动画效果
Dec 11 jQuery
在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+Html+缓存
2006/11/25 PHP
PHP 中关于ord($str)>0x80的详细说明
2012/09/23 PHP
50个PHP程序性能优化的方法
2014/06/02 PHP
Yii2超好用的日期和时间组件(值得收藏)
2016/05/05 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
2016/09/22 PHP
PHP获取文本框、密码域、按钮的值实例代码
2017/04/19 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
2017/07/03 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
2019/04/09 PHP
S2SH整合JQuery+Ajax实现登录验证功能实现代码
2013/01/30 Javascript
js不能跳转到上一页面的问题解决方法
2013/03/01 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
2014/01/26 Javascript
jQuery遍历json中多个map的方法
2015/02/12 Javascript
基于JavaScript实现移动端TAB触屏切换效果
2015/10/20 Javascript
jQuery中deferred对象使用方法详解
2016/07/14 Javascript
浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序
2017/02/19 Javascript
JS实现图片预览的两种方式
2017/06/27 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
webpack+vuex+axios 跨域请求数据的示例代码
2018/03/06 Javascript
webpack external模块的具体使用
2018/03/10 Javascript
只有 20 行的 JavaScript 模板引擎实例详解
2020/05/11 Javascript
[07:52]2014DOTA2 TI逗比武士游V社解说背后的故事
2014/07/10 DOTA
python发送邮件功能实现代码
2016/07/15 Python
Python3.4实现远程控制电脑开关机
2018/02/22 Python
解决Python下imread,imwrite不支持中文的问题
2018/12/05 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
2019/11/05 Python
python 中不同包 类 方法 之间的调用详解
2020/03/09 Python
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
英国儿童设计师服装的领先零售商:Base
2019/03/17 全球购物
校班主任推荐信范文
2013/12/03 职场文书
求职意向书范文
2014/04/01 职场文书
厨师长岗位职责范本
2014/08/25 职场文书
乡镇遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
2014年酒店工作总结与计划
2014/11/17 职场文书
高考百日冲刺决心书
2015/09/23 职场文书
职工的安全责任书范文!
2019/07/02 职场文书
加薪申请书应该这样写!
2019/07/04 职场文书