详解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与JS里submit()的区别示例介绍
Feb 17 Javascript
全面解析Bootstrap中nav、collapse的使用方法
May 22 Javascript
Javascript typeof与instanceof的区别
Oct 18 Javascript
canvas实现刮刮卡效果
Mar 14 Javascript
Node.js学习之TCP/IP数据通讯(实例讲解)
Oct 11 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
Oct 18 Javascript
JS运动特效之完美运动框架实例分析
Jan 24 Javascript
vue.js系列中的vue-fontawesome使用
Feb 10 Javascript
浅谈node中的cluster集群
Jun 02 Javascript
详解关于Vuex的action传入多个参数的问题
Feb 22 Javascript
vue远程加载sfc组件思路详解
Dec 25 Javascript
JavaScript内置对象之Array的使用小结
May 12 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 仿Comsenz安装效果代码打包提供下载
2010/05/09 PHP
php获取新浪微博数据API实例
2013/11/12 PHP
php的sprintf函数的用法 控制浮点数格式
2014/02/14 PHP
快速解决PHP调用Word组件DCOM权限的问题
2017/12/27 PHP
Alliance vs Liquid BO3 第三场2.13
2021/03/10 DOTA
JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))
2012/07/17 Javascript
javascript 中String.match()与RegExp.exec()的区别说明
2013/01/10 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
解析js原生方法创建表格效率测试
2013/07/08 Javascript
JS实现日期加减的方法
2013/11/29 Javascript
详解JavaScript节流函数中的Throttle
2016/07/16 Javascript
原生js实现下拉框功能(支持键盘事件)
2017/01/13 Javascript
jQuery插件HighCharts实现的2D条状图效果示例【附demo源码下载】
2017/03/15 Javascript
JavaScript数据结构之二叉树的查找算法示例
2017/04/13 Javascript
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
JS实现电商放大镜效果
2017/08/24 Javascript
快速解决vue-cli在ie9+中无效的问题
2018/09/04 Javascript
vue项目动态设置页面title及是否缓存页面的问题
2018/11/08 Javascript
微信小程序地图(map)组件点击(tap)获取经纬度的方法
2019/01/10 Javascript
实现高性能javascript的注意事项
2019/05/27 Javascript
轻松学习JavaScript函数中的 Rest 参数
2019/05/30 Javascript
jquery css实现流程进度条
2020/03/26 jQuery
Python实现matplotlib显示中文的方法详解
2018/02/06 Python
Django contenttypes 框架详解(小结)
2018/08/13 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
Python Map 函数的使用
2020/08/28 Python
HTML5中在title标题标签里设置小图标的方法
2020/06/23 HTML / CSS
澳大利亚第一的设计师礼服租赁网站:GlamCorner
2017/08/13 全球购物
生物化学研究助理员求职信
2013/10/09 职场文书
日语专业个人的求职信
2013/12/03 职场文书
水果超市创业计划书
2014/01/27 职场文书
机关门卫制度
2014/02/01 职场文书
数学系毕业生求职信
2014/05/29 职场文书
市级三好学生事迹材料
2014/08/27 职场文书
鼋头渚导游词
2015/02/05 职场文书
聘任书的格式及模板
2019/10/28 职场文书