详解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 URL参数判断,确定菜单样式
May 31 Javascript
JavaScript 获取当前时间戳的代码
Aug 05 Javascript
JavaScript prototype属性深入介绍
Nov 27 Javascript
JQuery动态添加和删除表格行的方法
Mar 09 Javascript
简单介绍JavaScript中字符串创建的基本方法
Jul 07 Javascript
JavaScript 闭包详细介绍
Sep 28 Javascript
Angular之指令Directive用法详解
Mar 01 Javascript
详解从新建vue项目到引入组件Element的方法
Aug 29 Javascript
微信小程序 循环及嵌套循环的使用总结
Sep 26 Javascript
jackson解析json字符串,首字母大写会自动转为小写的方法
Dec 22 Javascript
微信小程序实现点赞、取消点赞功能
Nov 02 Javascript
JS面向对象之多选框实现
Jan 17 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的5个安全措施小结
2012/07/17 PHP
深入php self与$this的详解
2013/06/08 PHP
tp5实现微信小程序多图片上传到服务器功能
2018/07/16 PHP
javascript与webservice的通信实现代码
2010/12/25 Javascript
Javascript URI 解析介绍
2015/03/15 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
2016/02/16 Javascript
Node.js返回JSONP详解
2016/05/18 Javascript
js检测离开或刷新页面时表单数据是否更改的方法
2016/08/02 Javascript
jQuery实现联动下拉列表查询框
2017/01/04 Javascript
javascript实现秒表计时器的制作方法
2017/02/16 Javascript
JS组件系列之JS组件封装过程详解
2017/04/28 Javascript
angular directive的简单使用总结
2017/05/24 Javascript
mui 打开新窗口的方式总结及注意事项
2017/08/20 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
jquery实现选项卡切换代码实例
2019/05/14 jQuery
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
2020/02/09 Javascript
js里面的变量范围分享
2020/07/18 Javascript
Python单例模式实例详解
2017/03/01 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
2017/07/27 Python
Python高级用法总结
2018/05/26 Python
Python骚操作之动态定义函数
2019/03/26 Python
在Python中使用MySQL--PyMySQL的基本使用方法
2019/11/19 Python
JupyterNotebook设置Python环境的方法步骤
2019/12/03 Python
Pytest mark使用实例及原理解析
2020/02/22 Python
Python2 与Python3的版本区别实例分析
2020/03/30 Python
俄罗斯Sportmarket体育在线商店:用于旅游和户外活动
2019/11/12 全球购物
庆八一活动方案
2014/01/25 职场文书
反邪教警示教育方案
2014/05/13 职场文书
党员承诺书格式
2014/05/21 职场文书
班级心理活动总结
2014/07/04 职场文书
暑期社会实践心得体会
2014/09/02 职场文书
群众路线教育实践活动自我剖析思想汇报
2014/10/04 职场文书
2014年餐厅服务员工作总结
2014/11/18 职场文书
专业技术人员年度考核评语
2014/12/31 职场文书
学生病假条范文
2015/08/17 职场文书
分析MySQL抛出异常的几种常见解决方式
2021/05/18 MySQL