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

寫在前面

一場大雪,整個(gè)杭城銀裝素裹,外面太冷就待在家里寫點(diǎn)東西吧。這次就來簡單談?wù)凬ode.js中異步編程的幾種寫法。

環(huán)境準(zhǔn)備

  • 編輯器vscode
  • 本地node環(huán)境(8.9.x)

本文內(nèi)容

在我們工作中異步變成應(yīng)該是非常常見的,請求接口,定時(shí)器,讀取文件等等。本篇文章主要通過一個(gè)讀取文件的例子簡單介紹一下Node.js應(yīng)用中如何從 CallBack方式 ——> Promise方式 ——> 使用util.promisify ——> async/await方式,讓代碼變得酷炫點(diǎn)

回調(diào)方式

假設(shè)我們本地有一個(gè)文件名為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)
})

缺點(diǎn):

  1. 回調(diào)地域(異步請求嵌套多了就很凌亂)
  2. 不能捕獲異常(try catch同步執(zhí)行)
  3. 看著不夠酷,現(xiàn)在都是2018年了

自己寫promise

既然上面的代碼不夠酷,那我們現(xiàn)在自己寫個(gè)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)
    })

這樣是不是看起來好多了,邏輯清晰,還可以統(tǒng)一捕獲失?。壳斑@種方式用的人應(yīng)該挺多的)

使用util.promisify

每次自己寫個(gè)Promise太累了吧?是的沒錯(cuò),還好Node 8中提供了一個(gè)util.promisify來幫助我們,那我們就不要重復(fù)造輪子了,愉快的引入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)
    })

是不是清爽很多?還不用自己動(dòng)手寫Promise太爽。

async與await

有人說既然說是2018年了,那還不用async/await?別急我們這就來試試(現(xiàn)在的Node版本中已經(jīng)可以支持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()

怎么樣這樣寫夠時(shí)尚了吧,最新的async/await也用上了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容