Asynchronous Code in Node


历史上,Node开发者只能用回调和事件emitters。

现在可以使用一些异步的语法:

  • async module
  • Promises
  • Async/await funcitons

Promise

the docs,

在hook下,一个基本的promise的运行。

Promises不是取代callback,它仍然使用callback。

例子:

这是传统的callback用法

  1. function myAsyncTimeoutFn(data, callback) {
  2. setTimeout(() => {
  3. callback()
  4. }, 1000)
  5. }
  6.  
  7. myAsyncTimeoutFn('just a silly string argument', () => {
  8. console.log('Final callback is here')
  9. })

Promise改变了代码的布局:

这是模仿Promise原理的代码。返回一个Promise对象。

  1. function myAsyncTimeoutFn(data) {
  2.  
  3. let _callback = null
  4. setTimeout( () => {
  5. if ( _callback ) _callback()
  6. }, 1000)
  7.  
  8. return {
  9. then(cb) {
  10. _callback = cb
  11. }
  12. }
  13. }
  14.  
  15. myAsyncTimeoutFn('just a silly string argument').then(() => {
  16. console.log('Final callback is here')
  17. })

这个对象有内有一个特别的方法then。

执行这个方法then,会设置回调_callback变量。

最后调用event queue的任务setTimeout()。执行_callback()。

⚠️:_callback这种写法只是告诉其他开发者这个方法是私有的。

如何处理错误?很简单在返回对象内的then方法添加一个错误参数。

  1. // 使用file system模块中的readFile()方法,异步函数。
  2. const fs = require('fs')
  3.  
  4. function readFilePromise( filename) {
  5. let _callback = () => {}
  6. let _errorCallback = () => {}
  7.  
  8. fs.readFile(filename, (error, buffer) => {
  9. if (error) _errorCallback(error)
  10. else _callback(buffer)
  11. })
  12.  
  13. return {
  14. then(cb, errCb) {
  15. _callback = cb
  16. _errorCallback = errCb
  17. }
  18. }
  19. }
  20.  
  21. readFilePromise('package.json').then( buffer => {
  22. console.log(buffer.toString() )
  23. process.exit(0)
  24. }, err => {
  25. console.error(err)
  26. process.exit(1)
  27. })

语法

  1. p.then(onFulfilled[, onRejected]);
  2.  
  3. p.then((value) => {
  4. // fulfillment
  5. }, (reason) => {
  6. // rejection
  7. });

1. 执行readFilePromise函数

2. fs.readFile()读数据,并存入内存,等待后续处理。

3. return返回一个对象。

4.调用对象的then方法。

5.从event queue中读取回调函数

  1. (error, buffer) => {
  2. if (error) _errorCallback(error)
  3. else _callback(buffer)
  4. })

改变一下上面的代码:

  1. readFilePromise('package.jsqn').then( buffer => {

就会在terminal 上打印错误信息:

  1. { [Error: ENOENT: no such file or directory, open 'package.jsqn']
  2. errno: -2,
  3. code: 'ENOENT',
  4. syscall: 'open',
  5. path: 'package.jsqn' }

总结:

我们没有使用回调callback参数在主函数中传递值,相反,我们使用callback参数在then方法内。

callback参数的值是一个函数会在之后处理。就像标准的回调函数一样。


Async functions

一个promise的wrapper。

优势:async/await函数的语法在其他语言如C#内已经存在。

下面使用async/await来重写

Practical Node.js (2018版) 14章, async code in Node的更多相关文章

  1. Practical Node.js (2018版) 13章, Node HTTP/2 Servers

    新增的章节. If you are not using HTTP/2, then you are losing out on big improvements. HTTP/2相比http/1有很大的区 ...

  2. Practical Node.js (2018版) 第9章: 使用WebSocket建立实时程序,原生的WebSocket使用介绍,Socket.IO的基本使用介绍。

    Real-Time Apps with WebSocket, Socket.IO, and DerbyJS 实时程序的使用变得越来越广泛,如传统的交易,游戏,社交,开发工具DevOps tools, ...

  3. Practical Node.js (2018版) 第7章:Boosting Node.js and Mongoose

    参考:博客 https://www.cnblogs.com/chentianwei/p/10268346.html 参考: mongoose官网(https://mongoosejs.com/docs ...

  4. Practical Node.js (2018版) 第5章:数据库 使用MongoDB和Mongoose,或者node.js的native驱动。

    Persistence with MongoDB and Mongoose https://github.com/azat-co/practicalnode/blob/master/chapter5/ ...

  5. Practical Node.js (2018版) 第10章:Getting Node.js Apps Production Ready

    Getting Node.js Apps Production Ready 部署程序需要知道的方面: Environment variables Express.js in production So ...

  6. Practical Node.js (2018版) 第3章:测试/Mocha.js, Chai.js, Expect.js

    TDD and BDD for Node.js with Mocha TDD测试驱动开发.自动测试代码. BDD: behavior-driven development行为驱动开发,基于TDD.一种 ...

  7. Practical Node.js (2018版) 第8章:Building Node.js REST API Servers

    Building Node.js REST API Servers with Express.js and Hapi Modern-day web developers use an architec ...

  8. Practical Node.js (2018版) 第4章: 模版引擎

    Template Engines: Pug and Handlebars 一个模版引擎是一个库或框架.它用一些rules/languages来解释data和渲染views. web app中,view ...

  9. [译]How to Install Node.js on Ubuntu 14.04 如何在ubuntu14.04上安装node.js

    原文链接为 http://www.hostingadvice.com/how-to/install-nodejs-ubuntu-14-04/ 由作者Jacob Nicholson 发表于October ...

随机推荐

  1. sql server实例内存使用统计

    转载于: http://blog.csdn.net/shutao917/article/details/51444424 SQL SERVER内存按存放数据的类型,大概可以分为三类: 1.buffer ...

  2. Win7 搭建Linux开发环境

    Vargant Vagrant 是一个基于 Ruby 的工具,用于创建和部署虚拟化开发环境.它使用 Oracle 的开源 VirtualBox 虚拟化系统,使用 Chef 创建自动化虚拟环境. 功能特 ...

  3. Angular2 File Upload

    Angular2 File Upload Install Install the components npm install ng2-file-upload --save github: https ...

  4. java框架之SpringBoot(5)-SpringMVC的自动配置

    本篇文章内容详细可参考官方文档第 29 节. SpringMVC介绍 SpringBoot 非常适合 Web 应用程序开发.可以使用嵌入式 Tomcat,Jetty,Undertow 或 Netty ...

  5. python数据结构-如何快速找到多个字典中的公共键

    如何快速找到多个字典中的公共键 问题举例 统计每轮都进球的球员: 第1轮{‘tom’:1, 'meixi':2} 第2轮{‘coco’:3, 'meixi':4, 'marton':2} 第3轮{'c ...

  6. rpm 包的安装、卸载、升级、查询、验证

    关键字: rpm 强制卸载jdk rpm -e j2sdk1.4.2_04 强制覆盖安装jdk rpm -Uvh j2sdk-1_4_1_02-fcs-linux-i586.rpm --force - ...

  7. 浏览器 User-Agent相关知识

    文章引用链接 http://www.360doc.com/content/12/1012/21/7662927_241124973.shtml

  8. The Code analysis of the FFDNet model

    1. 读取图像并判断是否为灰度图,如为RGB图转化为灰度图,并读取图像的w.h 2.数据格式转换:将uint8表示的读取图像矩阵变为double表示. 3.加入噪声,如果噪声水平$\sigma = 5 ...

  9. Python数据分析Numpy库方法简介(二)

    数据分析图片保存:vg 1.保存图片:plt.savefig(path) 2.图片格式:jpg,png,svg(建议使用,不失真) 3.数据存储格式: excle,csv csv介绍 csv就是用逗号 ...

  10. KNN算法 - 数据挖掘算法(3)

    (2017-04-10 银河统计) KNN算法即K Nearest Neighbor算法.这个算法是机器学习里面一个比较经典的.相对比较容易理解的算法.其中的K表示最接近自己的K个数据样本.KNN算法 ...