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

寫在前面

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

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

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

本文內(nèi)容

在我們工作中異步變成應(yīng)該是非常常見的垮刹,請(qǐng)求接口,定時(shí)器张弛,讀取文件等等荒典。本篇文章主要通過(guò)一個(gè)讀取文件的例子簡(jiǎn)單介紹一下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)地域(異步請(qǐng)求嵌套多了就很凌亂)
  2. 不能捕獲異常(try catch同步執(zhí)行)
  3. 看著不夠酷覆糟,現(xiàn)在都是2018年了

自己寫promise

既然上面的代碼不夠酷,那我們現(xiàn)在自己寫個(gè)Promise遮咖,讓它簡(jiǎn)化一下

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)
    })

這樣是不是看起來(lái)好多了滩字,邏輯清晰,還可以統(tǒng)一捕獲失斢獭(目前這種方式用的人應(yīng)該挺多的)

使用util.promisify

每次自己寫個(gè)Promise太累了吧麦箍?是的沒錯(cuò),還好Node 8中提供了一個(gè)util.promisify來(lái)幫助我們陶珠,那我們就不要重復(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

有人說(shuō)既然說(shuō)是2018年了,那還不用async/await寝姿?別急我們這就來(lái)試試(現(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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饵筑,一起剝皮案震驚了整個(gè)濱河市埃篓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌根资,老刑警劉巖架专,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異玄帕,居然都是意外死亡部脚,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門裤纹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)委刘,“玉大人,你說(shuō)我怎么就攤上這事鹰椒∥疲” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵漆际,是天一觀的道長(zhǎng)淆珊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)奸汇,這世上最難降的妖魔是什么施符? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任往声,我火速辦了婚禮,結(jié)果婚禮上戳吝,老公的妹妹穿的比我還像新娘浩销。我一直安慰自己,他們只是感情好骨坑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布撼嗓。 她就那樣靜靜地躺著柬采,像睡著了一般欢唾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上粉捻,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天礁遣,我揣著相機(jī)與錄音,去河邊找鬼肩刃。 笑死祟霍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盈包。 我是一名探鬼主播沸呐,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼呢燥!你這毒婦竟也來(lái)了崭添?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叛氨,失蹤者是張志新(化名)和其女友劉穎呼渣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寞埠,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屁置,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仁连。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓝角。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖饭冬,靈堂內(nèi)的尸體忽然破棺而出帅容,到底是詐尸還是另有隱情,我是刑警寧澤伍伤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布并徘,位于F島的核電站,受9級(jí)特大地震影響扰魂,放射性物質(zhì)發(fā)生泄漏麦乞。R本人自食惡果不足惜蕴茴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望姐直。 院中可真熱鬧倦淀,春花似錦、人聲如沸声畏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)插龄。三九已至愿棋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間均牢,已是汗流浹背糠雨。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留徘跪,地道東北人甘邀。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像垮庐,于是被迫代替她去往敵國(guó)和親松邪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 單線程與異步 JavaScript是單線程運(yùn)行哨查、支持異步機(jī)制的語(yǔ)言逗抑。進(jìn)入正題之前,我們有必要先理解這種運(yùn)行方式解恰。 ...
    heeroluo閱讀 697評(píng)論 0 1
  • 摘要: 深度理解JS事件循環(huán)7姘恕!护盈! 原文:JavaScript是如何工作的:事件循環(huán)和異步編程的崛起+ 5種使用 ...
    Fundebug閱讀 3,371評(píng)論 0 35
  • 單線程與異步 Javascript是單線程運(yùn)行挟纱、支持異步機(jī)制的語(yǔ)言。進(jìn)入正題之前腐宋,我們有必要先理解這種運(yùn)行方式紊服。 ...
    貝聊科技閱讀 626評(píng)論 0 0
  • 前言 我們知道Javascript語(yǔ)言的執(zhí)行環(huán)境是"單線程"。也就是指一次只能完成一件任務(wù)胸竞。如果有多個(gè)任務(wù)欺嗤,就必須...
    浪里行舟閱讀 14,328評(píng)論 1 27
  • 僅為方便個(gè)人查詢使用來(lái)源:http://es6.ruanyifeng.com/#docs/async-iterat...
    zqyadam閱讀 213評(píng)論 0 0