如何讓你代碼更酷炫——異步改造篇

寫在前面

一場大雪,整個杭城銀裝素裹,外面太冷就待在家裏寫點東西吧。此次就來簡單談談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

相關文章
相關標籤/搜索