如何让你代码更酷炫——异步改造篇

写在前面

一场大雪,整个杭城银装素裹,外面太冷就待在家里写点东西吧。此次就来简单谈谈Node.js中异步编程的几种写法。node

环境准备

  • 编辑器vscode
  • 本地node环境(8.9.x)

本文内容

在咱们工做中异步变成应该是很是常见的,请求接口,定时器,读取文件等等。本篇文章主要经过一个读取文件的例子简单介绍一下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

  1. 回调地域(异步请求嵌套多了就很凌乱)
  2. 不能捕获异常(try catch同步执行)
  3. 看着不够酷,如今都是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)
    })
复制代码

这样是否是看起来好多了,逻辑清晰,还能够统一捕获失败(目前这种方式用的人应该挺多的)async

使用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也用上了。ui

相关文章
相关标签/搜索