详解Node.js异步处理的各种写法

异步的“坑”

最近一段时间参与开发了一个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异步处理的各种写法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

(0)

相关推荐

  • Node.js 异步编程之 Callback介绍(一)

    Node.js 基于 JavaScript 引擎 v8,是单线程的.Node.js 采用了与通常 Web 上的 JavaScript 异步编程的方式来处理会造成阻塞的I/O操作.在 Node.js 中读取文件.访问数据库.网络请求等等都有可能是异步的.对于 Node.js 新人或者从其他语言背景迁移到 Node.js 上的开发者来说,异步编程是比较痛苦的一部分.本章将由浅入深为大家讲解 Node.js 异步编程的方方面面.从最基础的 callback 到 thunk.Promise.co 直到

  • 一个简单的Node.js异步操作管理器分享

    最近写nodejs比较多,刚开始的时候碰到的异步的操作比较少,因为想做的东西比较简单,一查api有同步的,为了省事就直接用同步的搞了,慢慢发现这不是个事呀,好好的异步特性不用,非得用同步的,真囧,并且很多东西木有同步的api的. 好!写异步的,慢慢的出现了这种代码... 复制代码 代码如下: mysql.query('xxxx').on('success', function(){   mysql.query('xxxx').on('success', function(){        my

  • node.js中的forEach()是同步还是异步呢

    node里几乎所有用到回调函数的地方,都是异步的,回调函数后面的代码很可能比回调函数中的代码后先执行,特别是数据库操作.当然,node也提供了同步版本的函数,例如文件操作,fs.readFileSync()是fs.readFile()的同步版本. 那么问题来了,forEach()是不是异步的呢?按理说,没有加Sync,应该是异步的呀. 复制代码 代码如下: var arr = ['a', 'b', 'c'];  var str = '123';  arr.forEach(function(ite

  • Node.js 异步异常的处理与domain模块解析

    异步异常处理 异步异常的特点 由于node的回调异步特性,无法通过try catch来捕捉所有的异常: try { process.nextTick(function () { foo.bar(); }); } catch (err) { //can not catch it } 而对于web服务而言,其实是非常希望这样的: //express风格的路由 app.get('/index', function (req, res) { try { //业务逻辑 } catch (err) { lo

  • 我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环

    一,node.js的作用, I/O的意义,(I/O是输入/输出的简写,如:键盘敲入文本,输入,屏幕上看到文本显示输出.鼠标移动,在屏幕上看到鼠标的移动.终端的输入,和看到的输出.等等)   node.js想解决的问题,(处理输入,输入,高并发 .如 在线游戏中可能会有上百万个游戏者,则有上百万的输入等等)(node.js适合的范畴:当应用程序需要在网络上发送和接收数据时Node.js最为适合.这可能是第三方的API,联网设备或者浏览器与服务器之间的实时通信)   并发的意义,(并发这个术语描述的

  • Node.js 如何利用异步提升任务处理速度

    今天在做一个小任务,需要调用阿里云的图像识别接口,对 62662 张照片进行场景识别,并将结果写到本地的 csv 文件中. 因为任务很简单,没想很多就开始码.自从有了 async/await 之后,已经很久不写 callback 了,所以上手就写成这样: 本文所有代码均有简化,只保留关键过程 async fetchSceneTags(imagePath) { try { const result = await callAliyunAPI(imagePath); return result.er

  • node.js下when.js 的异步编程实践

    假设一个业务场景: 通过rss地址,获取rss并保存于文件,rss地址保存于文件中. 完成该场景的业务需要完成3个任务: 1.从文件中读取rss地址. 2.获取rss. 3.保存于文件. 最后将这三个任务进行整合. 准备: 存放rss地址的文件,address.txt. http://programmer.csdn.net/rss_programmer.html   任务1: 读取rss地址文件的内容并通过callback返回. 复制代码 代码如下: var getRssAddress = fu

  • 详解Node.js异步处理的各种写法

    异步的"坑" 最近一段时间参与开发了一个Node.js后台项目,作为一个PHP开发者,上手项目本身并不难,但是开发的过程却并不顺利,不顺利的主要原因在于思路上没有转变,没有从 同步 的思维转换到 异步 的思维. 所谓 同步 ,就是程序(线程)在一个任务的处理过程中,不会插入处理其他任务,即使遇到IO等不占CPU的操作,也会一直等待其结束才会继续往下处理. 所谓 异步 ,就是程序(线程)在一个任务的处理过程中,会插入处理其他任务,如遇到IO操作,当前任务会将程序(线程)的控制权释放给其他

  • 详解node.js中的npm和webpack配置方法

    概述 Node.js用c++语言编写而成的,是一个基于chrome V8引擎的javascript运行环境,让javaScript的运行脱离浏览器服务端,可以使用javaScript语言书写服务器端代码 1.使用node来实现一个http服务器 下面创建了一个端口为8787的服务器.他与php,java等不同,像php本地还要基于阿帕奇服务器,node.js能用代码快速搭建一个服务器. // 引入http模块 var http = require("http"); // 调用http的

  • 详解node.js 事件循环

    Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高. Node.js 几乎每一个 API 都是支持回调函数的. Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现. Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数. 事件驱动程序 Node.js 使用事件驱动模型,当web server接收到请

  • 详解Node.JS模块 process

    process 模块是 nodejs 提供给开发者用来和当前进程交互的工具,它的提供了很多实用的 API.从文档出发,管中窥豹,进一步认识和学习 process 模块: 如何处理命令参数? 如何处理工作目录? 如何处理异常? 如何处理进程退出? process 的标准流对象 深入理解 process.nextTick 如何处理命令参数? 命令行参数指的是 2 个方面: 传给 node 的参数.例如 node --harmony script.js --version 中,--harmony 就是

  • 详解Node.js如何处理ES6模块

    一.两种模块的差异 ES6 模块和 CommonJS 模块有很大的差异. 语法上面,CommonJS 模块使用require()加载和module.exports输出,ES6 模块使用import和export. 用法上面,require()是同步加载,后面的代码必须等待这个命令执行完,才会执行.import命令则是异步加载,或者更准确地说,ES6 模块有一个独立的静态解析阶段,依赖关系的分析是在那个阶段完成的,最底层的模块第一个执行. 二.Node.js 的区分 Node.js 要求 ES6

  • 详解Node.js使用token进行认证的简单示例

    本文只介绍简单的应用,关于json web token的具体介绍以及原理请参考阮一峰老师的JSON Web Token 入门教程. 使用的Node框架是koa2,前端发送ajax请求使用axios 首先创建工程目录: static中存放静态资源,views存放前端模板,server.js为后端代码. 安装必要的依赖项: "dependencies": { "@koa/router": "^8.0.8", "jsonwebtoken&qu

  • 详解node.js创建一个web服务器(Server)的详细步骤

    前言 在 node.js 中创建一个服务器非常简单,只需要使用 node.js 为我们提供的 http 模块及相关 API 即可创建一个麻雀虽小但五脏俱全的web 服务器,相比 Java/Python/Ruby 搭建web服务器的过程简单的很. http model 要想创建一个基于 node.js 的 web 服务器,你就必须使用 node.js 提供的 http 模块,node.js 中的 http 接口旨在支持传统上难以使用的协议的许多特性, 特别是,大块的.可能块编码的消息,接口永远不会

  • 详解Node.js中间件是怎样工作的

    目录 什么是 Express 中间件? 编写 Express 中间件的要求 Express中间件:基础 中间件解决什么问题?为什么要用它? 中间件函数是什么样的? 中间件链 Express中间件的类型 内置中间件 错误处理中间件 第三方级别的中间件 总结 什么是 Express 中间件? 中间件在字面上的意思是你在软件的一层和另一层中间放置的任何东西. Express 中间件是在对 Express 服务器请求的生命周期内所执行的函数. 每个中间件都可以访问其被附加到的所有路由的 HTTP 请求和

  • 详解Node.js 应用高 CPU 占用率分析方法

    目录 本地运行 Node.js 应用 如何采集生产系统上的 Node.js 应用性能数据 本地运行 Node.js 应用 我们在本地运行 Node.js 应用,使用 --inspect 标志启动应用程序,再次执行负载测试,在 Chrome 浏览器中打开 chrome://inspect: 单击应用下方的 inspect 按钮,然后开始 CPU 占用率分析: 等待一段时间后,就能看到 CPU profile 的结果: 如何采集生产系统上的 Node.js 应用性能数据 在大多数情况下,如果性能问题

  • 详解Node.js中的Async和Await函数

    在本文中,你将学习如何使用Node.js中的async函数(async/await)来简化callback或Promise. 异步语言结构在其他语言中已经存在了,像c#的async/await.Kotlin的coroutines.go的goroutines,随着Node.js 8的发布,期待已久的async函数也在其中默认实现了. Node中的async函数是什么? 当函数声明为一个Async函数它会返回一个 AsyncFunction 对象,它们类似于 Generator 因为执可以被暂停.唯

随机推荐