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

写在前面

一场大雪,整个杭城银装素裹,外面太冷就待在家里写点东西吧。这次就来简单谈谈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)
})
复制代码

缺点:

  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)
    })
复制代码

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值