详解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 25 Javascript
js利用div背景,做一个竖线的效果。
Nov 22 Javascript
页面图片浮动左右滑动效果的简单实现案例
Feb 10 Javascript
JavaScript和CSS交互的方法汇总
Dec 02 Javascript
node.js中的http.createClient方法使用说明
Dec 15 Javascript
javascript制作的cookie封装及使用指南
Jan 02 Javascript
js验证真实姓名与身份证号,手机号的简单实例
Jul 18 Javascript
vue component组件使用方法详解
Jul 14 Javascript
微信小程序+腾讯地图开发实现路径规划绘制
May 22 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
May 27 jQuery
jQuery实现高度灵活的表单验证功能示例【无UI】
Apr 30 jQuery
手把手带你搭建一个node cli的方法示例
Aug 07 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中的extract的作用分析
2008/04/09 PHP
PHP 编程的 5个良好习惯
2009/02/20 PHP
基于simple_html_dom的使用小结
2013/07/01 PHP
php调用MySQL存储过程的方法集合(推荐)
2013/07/03 PHP
php session_start()出错原因分析及解决方法
2013/10/28 PHP
PHP文件操作详解
2016/12/30 PHP
PHP curl批处理及多请求并发实现方法分析
2018/08/15 PHP
PHP执行linux命令6个函数代码实例
2020/11/24 PHP
我用的一些Node.js开发工具、开发包、框架等总结
2014/09/25 Javascript
javascript常用的方法分享
2015/07/01 Javascript
使用postMesssage()实现iframe跨域页面间的信息传递
2016/03/29 Javascript
详解微信小程序开发之——wx.showToast(OBJECT)的使用
2017/01/18 Javascript
javascript使用btoa和atob来进行Base64转码和解码
2017/03/20 Javascript
Javascript实现倒计时时差效果
2017/05/18 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
JavaScript通过mouseover()实现图片变大效果的示例
2017/12/20 Javascript
vuex根据不同的用户权限展示不同的路由列表功能
2019/09/20 Javascript
vue请求服务器数据后绑定不上的解决方法
2019/10/30 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
对TensorFlow中的variables_to_restore函数详解
2018/07/30 Python
python3+pyqt5+itchat微信定时发送消息的方法
2019/02/20 Python
Python Django搭建网站流程图解
2020/06/13 Python
Python改变对象的字符串显示的方法
2020/08/01 Python
英国花园药房: The Garden Pharmacy
2017/12/28 全球购物
颁奖晚会主持词
2014/03/25 职场文书
党员领导干部承诺书
2014/05/28 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
庆国庆活动总结
2014/08/28 职场文书
党员个人剖析材料(四风问题)
2014/10/07 职场文书
2014小学语文教师个人工作总结
2014/12/03 职场文书
文言文辞职信
2015/02/28 职场文书
2015年国庆节寄语
2015/08/17 职场文书
golang 比较浮点数的大小方式
2021/05/02 Golang
python编程项目中线上问题排查与解决
2021/11/01 Python
浅谈Redis跟MySQL的双写问题解决方案
2022/02/24 Redis
Win10此设备不支持接收Miracast无法投影的解决方法
2022/07/07 数码科技