详解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批量控制form禁用的代码
Aug 06 Javascript
jquery实现的下拉和收缩效果示例
Aug 21 Javascript
基于豆瓣API+Angular开发的web App
Jan 02 Javascript
JavaScript实现自动消除按钮功能的方法
Aug 05 Javascript
AngularJS实现分页显示数据库信息
Jul 01 Javascript
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
Mar 25 jQuery
vue.js移动数组位置,同时更新视图的方法
Mar 08 Javascript
微信小程序url传参写变量的方法
Aug 09 Javascript
react 国际化的实现代码示例
Sep 14 Javascript
Javascript中parseInt的正确使用方式
Oct 17 Javascript
vue-element-admin 菜单标签失效的解决方式
Nov 12 Javascript
vue自动添加浏览器兼容前后缀操作
Aug 13 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 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
2016/01/04 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
2016/05/26 PHP
PHP邮箱验证示例教程
2016/06/01 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
2016/12/14 PHP
PHP中16个高危函数整理
2019/09/19 PHP
通过js简单实现将一个文本内容转译成加密文本
2013/10/22 Javascript
使用jquery实现以post打开新窗口
2014/03/19 Javascript
js图片滚动效果时间可随意设定当鼠标移上去时停止
2014/06/26 Javascript
js实现飞入星星特效代码
2014/10/17 Javascript
node.js中的path.extname方法使用说明
2014/12/09 Javascript
深入理解JavaScript系列(30):设计模式之外观模式详解
2015/03/03 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
2015/12/02 Javascript
AngularJS 入门教程之HTML DOM实例详解
2016/07/28 Javascript
JS实现的tab切换选项卡效果示例
2017/02/28 Javascript
简单实现js菜单栏切换效果
2017/03/04 Javascript
Node.js服务器开启Gzip压缩教程
2017/08/11 Javascript
详解Web使用webpack构建前端项目
2017/09/23 Javascript
关于express与koa的使用对比详解
2018/01/25 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
浅谈js中的attributes和Attribute的用法与区别
2020/07/16 Javascript
完美解决通过IP地址访问VUE项目的问题
2020/07/18 Javascript
在Python的Django框架中编写编译函数
2015/07/20 Python
浅析Python中yield关键词的作用与用法
2016/11/29 Python
Django shell调试models输出的SQL语句方法
2019/08/29 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
2020/05/22 Python
html5 offlline 缓存使用示例
2013/06/24 HTML / CSS
2014年圣诞节倒计时网页的制作过程
2014/12/05 HTML / CSS
《燕子》教学反思
2014/02/18 职场文书
中国梦演讲稿教师篇
2014/04/23 职场文书
转让协议书范本
2014/09/13 职场文书
中学生清明节演讲稿
2015/03/18 职场文书
2015年世界粮食日演讲稿
2015/03/20 职场文书
监理中标通知书
2015/04/16 职场文书
2016年幼儿园万圣节活动总结
2016/04/05 职场文书
教你怎么用python爬取爱奇艺热门电影
2021/05/20 Python
Hive日期格式转换方法总结
2022/06/25 数据库