写在前面
一场大雪,整个杭城银装素裹,外面太冷就待在家里写点东西吧。这次就来简单谈谈Node.js中异步编程的几种写法。
环境准备
- 编辑器vscode
- 本地node环境(8.9.x)
本文内容
在我们工作中异步变成应该是非常常见的,请求接口,定时器,读取文件等等。本篇文章主要通过一个读取文件的例子简单介绍一下Node.js应用中如何从 CallBack方式 ——> Promise方式 ——> 使用util.promisify ——> async/await方式,让代码变得酷炫点
回调方式
假设我们本地有一个文件名为test.json,下面是最原始的读取文件的方式,相信大家都很熟悉
// callback.js
const fs = require('fs')
fs.readFile('./test.json', (err, data) => {
if (err) return console.log(err)
data = JSON.parse(data)
console.log(data.name)
})
缺点:
- 回调地域(异步请求嵌套多了就很凌乱)
- 不能捕获异常(try catch同步执行)
- 看着不够酷,现在都是2018年了
自己写promise
既然上面的代码不够酷,那我们现在自己写个Promise,让它简化一下
const fs = require('fs')
function readFileAsync (path) {
return new Promise((resolve, reject) => {
fs.readFile(path, (err, data) => {
if (err) reject(err)
else resolve(data)
})
})
}
readFileAsync('./test.json')
.then(data => {
data = JSON.parse(data)
console.log(data.name)
}).catch(err => {
console.log(err)
})
这样是不是看起来好多了,逻辑清晰,还可以统一捕获失败(目前这种方式用的人应该挺多的)
使用util.promisify
每次自己写个Promise太累了吧?是的没错,还好Node 8中提供了一个util.promisify来帮助我们,那我们就不要重复造轮子了,愉快的引入util工具类,改造代码
const util = require('util')
util.promisify(fs.readFile)('./test.json')
.then(JSON.parse)
.then(data => {
console.log(data.name)
}).catch(err => {
console.log(err)
})
是不是清爽很多?还不用自己动手写Promise太爽。
async与await
有人说既然说是2018年了,那还不用async/await?别急我们这就来试试(现在的Node版本中已经可以支持async/await了)
const fs = require('fs')
const util = require('util')
const readAsync = util.promisify(fs.readFile)
async function init () {
try {
let data = await readAsync('./test.json')
data = JSON.parse(data)
console.log(data.name)
} catch (err) {
console.log(err)
}
}
init()
怎么样这样写够时尚了吧,最新的async/await也用上了。