一场大雪,整个杭城银装素裹,外面太冷就待在家里写点东西吧。此次就来简单谈谈Node.js中异步编程的几种写法。node
在咱们工做中异步变成应该是很是常见的,请求接口,定时器,读取文件等等。本篇文章主要经过一个读取文件的例子简单介绍一下Node.js应用中如何从 CallBack方式 ——> Promise方式 ——> 使用util.promisify ——> async/await方式,让代码变得酷炫点编程
假设咱们本地有一个文件名为test.json,下面是最原始的读取文件的方式,相信你们都很熟悉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)
})
复制代码
缺点: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)
})
复制代码
这样是否是看起来好多了,逻辑清晰,还能够统一捕获失败(目前这种方式用的人应该挺多的)async
每次本身写个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太爽。异步编程
有人说既然说是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也用上了。ui