详解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代码超级推荐
Apr 05 Javascript
javaScript Array(数组)相关方法简述
Jul 25 Javascript
判断浏览器的javascript版本的代码
Sep 03 Javascript
纯JavaScript实现获取onclick、onchange等事件的值
Dec 29 Javascript
angularJS 如何读写缓冲的方法(推荐)
Aug 06 Javascript
Javascript中构造函数要注意的一些坑
Jan 23 Javascript
微信小程序左右滑动切换页面详解及实例代码
Feb 28 Javascript
w3c编程挑战_初级脚本算法实战篇
Jun 23 Javascript
vue.js添加一些触摸事件以及安装fastclick的实例
Aug 28 Javascript
vue-router懒加载速度缓慢问题及解决方法
Nov 25 Javascript
vue之debounce属性被移除及处理详解
Nov 13 Javascript
Vue页面渲染中key的应用实例教程
Jan 12 Vue.js
在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 常用类整理
2009/12/23 PHP
PHP实现带重试功能的curl连接示例
2016/07/28 PHP
PHP接收App端发送文件流的方法
2016/09/23 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
关于实现代码语法标亮 dp.SyntaxHighlighter
2007/02/02 Javascript
javascript 设计模式之单体模式 面向对象学习基础
2010/04/18 Javascript
减少访问DOM的次数提升javascript性能
2014/02/24 Javascript
JavaScript Serializer序列化时间处理示例
2014/07/31 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
nodejs教程之制作一个简单的文章发布系统
2014/11/21 NodeJs
js兼容火狐获取图片宽和高的方法
2015/05/21 Javascript
JS类的定义与使用方法深入探索
2016/11/26 Javascript
详解JavaScript调用栈、尾递归和手动优化
2017/06/03 Javascript
JS严格模式知识点总结
2018/02/27 Javascript
vue项目中添加单元测试的方法
2018/07/21 Javascript
利用vue3+ts实现管理后台(增删改查)
2020/10/30 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
浅谈Python的Django框架中的缓存控制
2015/07/24 Python
python实现日常记账本小程序
2018/03/10 Python
基于python批量处理dat文件及科学计算方法详解
2018/05/08 Python
python3中property使用方法详解
2019/04/23 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
django的聚合函数和aggregate、annotate方法使用详解
2019/07/23 Python
python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例
2020/02/28 Python
酒店司机岗位职责
2013/12/14 职场文书
关于奉献的演讲稿
2014/05/21 职场文书
奥林匹克的口号
2014/06/13 职场文书
幼儿园健康教育方案
2014/06/14 职场文书
授权委托书(法人单位用)
2014/09/29 职场文书
KTV门卫岗位职责
2014/10/09 职场文书
党的群众路线教育实践活动整改方案
2014/10/28 职场文书
优秀班组事迹材料
2014/12/24 职场文书
辅导员学期工作总结
2015/08/14 职场文书
施工安全责任协议书
2016/03/23 职场文书
web前端之css水平居中代码解析
2021/05/20 HTML / CSS
公历12个月名称的由来
2022/04/12 杂记