详解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复选框CHECKBOX全选,取消全选
Aug 30 Javascript
JavaScript 获得选中文本内容的方法
Feb 15 Javascript
由document.body和document.documentElement想到的
Apr 13 Javascript
Prototype Hash对象 学习
Jul 19 Javascript
JavaScript替换当前页面的方法
Apr 03 Javascript
JavaScript中实现无缝滚动、分享到侧边栏实例代码
Apr 06 Javascript
javascript实现根据汉字获取简拼
Sep 25 Javascript
Vue.JS入门教程之事件监听
Dec 01 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
Jan 03 Javascript
Angular Material Icon使用详解
Nov 07 Javascript
layui实现数据表格自定义数据项
Oct 26 Javascript
微信小程序实现时间进度条功能
Nov 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函数array_merge用法一例(合并同类数组)
2013/02/03 PHP
php 启动报错如何解决
2014/01/17 PHP
php加密算法之实现可逆加密算法和解密分享
2014/01/21 PHP
Django中通过定时任务触发页面静态化的处理方式
2018/08/29 PHP
extjs grid取到数据而不显示的解决
2008/12/29 Javascript
javascript 设为首页与加入收藏兼容多浏览器代码
2011/01/11 Javascript
5个javascript的数字格式化函数分享
2011/12/07 Javascript
jQuery插件实现表格隔行换色且感应鼠标高亮行变色
2013/09/22 Javascript
Css3制作变形与动画效果
2015/07/24 Javascript
js图片轮播特效代码分享
2015/09/07 Javascript
js前端解决跨域问题的8种方案(最新最全)
2016/11/18 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
一次围绕setTimeout的前端面试经验分享
2017/06/15 Javascript
vue小图标favicon不显示的解决方案
2017/09/19 Javascript
vue 指令之气泡提示效果的实现代码
2018/10/18 Javascript
vue 实现input表单元素的disabled示例
2019/10/28 Javascript
JavaScript Window窗口对象属性和使用方法
2020/01/19 Javascript
ssm+vue前后端分离框架整合实现(附源码)
2020/07/08 Javascript
node.js通过Sequelize 连接MySQL的方法
2020/12/28 Javascript
Python中的time模块与datetime模块用法总结
2016/06/30 Python
python解决Fedora解压zip时中文乱码的方法
2016/09/18 Python
基于python3实现socket文件传输和校验
2018/07/28 Python
对python numpy.array插入一行或一列的方法详解
2019/01/29 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
2019/07/31 Python
Python ORM框架Peewee用法详解
2020/04/29 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
美国大码时尚女装购物网站:ELOQUII
2017/12/28 全球购物
纽约州一群才华横溢的金匠制作而成:Hearth Jewelry
2019/03/22 全球购物
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
自主招生自荐书
2013/11/29 职场文书
简历里的自我评价范文
2014/02/24 职场文书
十佳护士先进事迹
2014/05/08 职场文书
五心教育心得体会
2014/09/04 职场文书
投资意向协议书
2015/01/29 职场文书
4S店收银员岗位职责
2015/04/07 职场文书
《曾国藩家书》读后感——读家书,立家风
2019/08/21 职场文书