详解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 相关文章推荐
用 JSON 处理缓存
Apr 27 Javascript
javascript测试题练习代码
Oct 10 Javascript
JavaScript多线程详解
Aug 12 Javascript
清除js缓存的多种方法总结
Dec 09 Javascript
javascript动画系列之模拟滚动条
Dec 13 Javascript
Map.vue基于百度地图组件重构笔记分享
Apr 17 Javascript
基于AngularJS实现表单验证功能
Jul 28 Javascript
React + webpack 环境配置的方法步骤
Sep 07 Javascript
Webpack优化配置缩小文件搜索范围
Dec 25 Javascript
webpack中的热刷新与热加载的区别
Apr 09 Javascript
微信小程序如何刷新当前界面的实现方法
Jun 07 Javascript
javascript canvas封装动态时钟
Sep 30 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关于foreach复制知识点总结
2019/01/28 PHP
javascript数组的扩展实现代码集合
2008/06/01 Javascript
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
2011/12/20 Javascript
Extjs优化(二)Form表单提交通用实现
2013/04/15 Javascript
JS、CSS加载中的小问题探讨
2013/11/26 Javascript
js离开或刷新页面检测(且兼容FF,IE,Chrome)
2014/03/05 Javascript
JavaScript中this详解
2015/09/01 Javascript
AngularJs Understanding the Controller Component
2016/09/02 Javascript
ie下js不执行的几种可能
2017/02/28 Javascript
React Native中Navigator的使用方法示例
2017/10/13 Javascript
jquery ztree实现右键收藏功能
2017/11/20 jQuery
Layer弹出层动态获取数据的方法
2018/08/20 Javascript
Nodejs 识别图片类型的方法
2019/08/15 NodeJs
js实现点击烟花特效
2020/10/14 Javascript
vue3.0搭配.net core实现文件上传组件
2020/10/29 Javascript
详解Vue的七种传值方式
2021/02/08 Vue.js
[01:11:32]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python+pandas生成指定日期和重采样的方法
2018/04/11 Python
python socket网络编程之粘包问题详解
2018/04/28 Python
Python 3.8新特征之asyncio REPL
2019/05/28 Python
Django使用模板后无法找到静态资源文件问题解决
2019/07/19 Python
如何基于python测量代码运行时间
2019/12/25 Python
python实现微信打飞机游戏
2020/03/24 Python
python3 deque 双向队列创建与使用方法分析
2020/03/24 Python
如何用python实现一个HTTP连接池
2021/01/14 Python
用css3写出气球样式的示例代码
2017/09/11 HTML / CSS
毕业自我鉴定
2013/11/05 职场文书
个人职业生涯规划书1500字
2013/12/31 职场文书
数学国培研修感言
2014/02/13 职场文书
学雷锋宣传标语
2014/06/25 职场文书
会议欢迎标语
2014/06/30 职场文书
公务员爱岗敬业演讲稿
2014/08/26 职场文书
民事代理词范文
2015/05/25 职场文书
政协常委会议主持词
2015/07/03 职场文书
职工的安全责任书范文!
2019/07/02 职场文书
sql通过日期判断年龄函数的示例代码
2021/07/16 SQL Server