详解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 相关文章推荐
火狐4、谷歌12不支持Jquery Validator的解决方法分享
Jun 20 Javascript
表单元素的submit()方法和onsubmit事件应用概述
Feb 01 Javascript
JavaScript实现点击按钮后变灰避免多次重复提交
Jul 15 Javascript
JavaScript中最容易混淆的作用域、提升、闭包知识详解(推荐)
Sep 05 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
Jan 04 Javascript
vue2.0项目实现路由跳转的方法详解
Jun 21 Javascript
JS块级作用域和私有变量实例分析
May 11 Javascript
vue中axios实现数据交互与跨域问题
May 12 Javascript
webpack4 从零学习常用配置(小结)
May 28 Javascript
13 个npm 快速开发技巧(推荐)
Jul 04 Javascript
node 文件上传接口的转发的实现
Sep 23 Javascript
vue+openlayers绘制省市边界线
Dec 24 Vue.js
在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 设置MySQL连接字符集的方法
2011/01/02 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
laravel框架数据库配置及操作数据库示例
2019/10/10 PHP
JavaScript 异步调用框架 (Part 5 - 链式实现)
2009/08/04 Javascript
基于jquery的表头固定的若干方法
2011/01/27 Javascript
json数据处理技巧(字段带空格、增加字段、排序等等)
2013/06/14 Javascript
javascript中Date对象的getDay方法使用指南
2014/12/22 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
针对JavaScript中this指向的简单理解
2016/08/26 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
2016/11/30 Javascript
ES6中Iterator与for..of..遍历用法分析
2017/03/31 Javascript
分享ES6的7个实用技巧
2018/01/18 Javascript
mpvue性能优化实战技巧(小结)
2019/04/17 Javascript
Layui表格行工具事件与数据回填方法
2019/09/13 Javascript
vue3.0中setup使用(两种用法)
2020/12/02 Vue.js
[41:52]2018DOTA2亚洲邀请赛3月29日 小组赛A组 TNC VS OpTic
2018/03/30 DOTA
[01:02:26]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第二场 1月18日
2021/03/11 DOTA
Python备份Mysql脚本
2008/08/11 Python
Python and、or以及and-or语法总结
2015/04/14 Python
使用python验证代理ip是否可用的实现方法
2018/07/25 Python
python实现批量处理将图片粘贴到另一张图片上并保存
2019/12/12 Python
使用Python提取文本中含有特定字符串的方法示例
2020/12/09 Python
详解HTML5 Canvas绘制时指定颜色与透明度的方法
2016/03/25 HTML / CSS
video实现有声音自动播放的实现方法
2020/05/20 HTML / CSS
video.js支持m3u8格式直播的实现示例
2020/05/20 HTML / CSS
新西兰领先的鞋类和靴子网上商城:Merchant 1948
2017/09/08 全球购物
英国门销售网站:Green Tree Doors
2020/01/07 全球购物
物理力学求职信
2014/02/18 职场文书
计算机通信专业推荐信
2014/02/22 职场文书
科技工作者先进事迹
2014/08/16 职场文书
中职毕业生自我鉴定范文(3篇)
2014/09/28 职场文书
学院党的群众路线教育实践活动第一阶段情况汇报
2014/10/25 职场文书
展览会邀请函
2015/02/02 职场文书
详解nginx.conf 中 root 目录设置问题
2021/04/01 Servers
Log4j.properties配置及其使用
2021/08/02 Java/Android
SQL解决未能删除约束问题drop constraint
2022/05/30 SQL Server