如何把函數(shù)都用promise方式實現(xiàn)壁却?

如何把函數(shù)都用promise方式實現(xiàn)批狱?

我覺得這是一個好問題。當前在我所在的公司展东,只要用 NodeJS 進行開發(fā)赔硫,從框架到具體的應用實例到工具,已經(jīng)全部遷移到以 promise 為中心開發(fā)方式盐肃。帶來的好處是大家都使用 promise 進行異步方案的解決爪膊,不用再考慮回調(diào)( callback )。
但是事情總有特例砸王,現(xiàn)實npm上推盛,還是有很多的庫還沒有用promise進行實現(xiàn),如:node 中的標準庫处硬。這樣讓使用者很難受小槐,用著用著 promise 出現(xiàn)了一個 callback 拇派,你會覺得世界為什么就這么亂呢荷辕?

神說要有光凿跳,于是就有了光!我也想說疮方,大神說要解決控嗜,于是就有了 promoisify

1 什么是 promisify

簡單來說: promisify 就是把帶有 callback 函數(shù)骡显,變成重新用 promise 來實現(xiàn)的一種技術(shù)方案疆栏,它能一勞永逸的解決:如何把函數(shù)都用 promise 重新實現(xiàn)的問題。

2 promisify 的使用

promisify 的使用惫谤,當然脫離不了某一個 promise 的實現(xiàn)壁顶。在這里,我選擇 bluebird 溜歪。因為它足夠強大若专,學習使用 promise ,就它足夠了蝴猪。

下面來說說:bluebird中有關(guān)promisify的一些方法调衰。

bluebirdAPI中,兩個方法可以幫助你自阱,它們分別是:promiseify 和 promisifyall嚎莉。

2.1 promisify

prmoisify的作是:將一個 nodeCallback 形式函數(shù)調(diào)用轉(zhuǎn)為 promise

這里需要解釋一下: nodeCallback 是什么意思沛豌。

nodeCallbackNodojs 中的一個常用詞趋箩。表達是意思是:Nodejs 中,以錯誤優(yōu)先的回調(diào)函數(shù)的總稱加派。

它包括兩個意思:

  1. nodeCallback 回調(diào)函數(shù)簽名阁簸。
  2. nodeCallBack 回調(diào)函數(shù)出現(xiàn)的位置。

nodeCallback 簽名

該回調(diào)函數(shù)的簽名一定是這樣:

// 這樣是對的
function fooCallBack(err, a, b){
  // something
  console.log(a,b);
}

// 這樣不對
function foo1CallBack(a,b,err){
  
}

可以看到哼丈,fooCallBack 函數(shù)的調(diào)用參數(shù)中启妹,第一個參數(shù)是: err, 也就是說的 noodeCallBack 函數(shù)的第一個參數(shù)一定傳入的是 err ,而不能是別的參數(shù)醉旦。只要滿足了這個條件饶米,都可叫 nodeCallback

nodeCallBack 出現(xiàn)的順序

nodeCallBack 一定出現(xiàn)在異步函數(shù)的最后一個车胡,也就是這樣:


// 這樣是對的檬输。
function foo(a,b,nodeCallback){
  // pass
}

// 這樣就不是 nodeCallback
function foo(a,nodeCallback,b){
  // pass
}

只要滿足了簽名和順序,就可以叫做 nodeCallBack匈棘。

nodeCallback 存在哪里呢丧慈?告訴你吧,所有的 NodeJS 標準包中異步的地方都是它。

好了說了這么多 nodeCallback逃默,現(xiàn)在來說說 promosify 怎樣使用:


const Promise = require('bluebird');
const fs = require('fs');

// 回調(diào)形式鹃愤,這里的callback 就是 nodeCallback
fs.readFile('./test.js',function(err,data){
  console.log(data);
});

// promisify 形式
const readFileAsync = Promise.promisify(fs.readFile);

readFileAsync('./test.js').then(function(data){
  console.log(data);
}).catch(console.log);

很簡單吧。具體實現(xiàn)就不說了完域,想要了解的去 google 吧软吐。

2.2 promisifyall

如果說 promisify 只能一次轉(zhuǎn)一個函數(shù),那 promisifyall 的作用就是一次把一個庫的文件轉(zhuǎn)完吟税。

說的更清楚一點凹耙,promisifyall 能把一個庫中有函數(shù)全部變成 promise 的形式,改變后的函數(shù)都帶上了 Async 的后綴肠仪⌒けВ看代碼:

const Promise = require('bluebird');

const fs = Promise.promisifyall(require('fs'));

fs.readFileAsync('./test.js').then(function(data){
  console.log(data);
}).catch(console.log);

從上面可以知道:fs 這個標準庫,經(jīng)過 promisifyall , 所有的函數(shù)都已經(jīng)被 promise 化了异旧。而被 promise 化的函數(shù)名變成了:原來的函數(shù)名+Async虐沥。

3 結(jié)論

當學會使用 promisify 和 promisifyall 這兩個方法,我相信大家以后都對:如何把函數(shù)都用promise方式實現(xiàn)泽艘? 這樣的問題胸有成竹了吧欲险。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市匹涮,隨后出現(xiàn)的幾起案子天试,更是在濱河造成了極大的恐慌,老刑警劉巖然低,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喜每,死亡現(xiàn)場離奇詭異,居然都是意外死亡雳攘,警方通過查閱死者的電腦和手機带兜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吨灭,“玉大人刚照,你說我怎么就攤上這事⌒郑” “怎么了无畔?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吠冤。 經(jīng)常有香客問我浑彰,道長,這世上最難降的妖魔是什么拯辙? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任郭变,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诉濒。我一直安慰自己周伦,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布循诉。 她就那樣靜靜地躺著,像睡著了一般撇他。 火紅的嫁衣襯著肌膚如雪茄猫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天困肩,我揣著相機與錄音划纽,去河邊找鬼。 笑死锌畸,一個胖子當著我的面吹牛勇劣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播潭枣,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼比默,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了盆犁?” 一聲冷哼從身側(cè)響起命咐,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谐岁,沒想到半個月后醋奠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡伊佃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年窜司,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片航揉。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡塞祈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出帅涂,到底是詐尸還是另有隱情织咧,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布漠秋,位于F島的核電站笙蒙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏庆锦。R本人自食惡果不足惜捅位,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧艇搀,春花似錦尿扯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至矩屁,卻和暖如春辟宗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吝秕。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工泊脐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烁峭。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓容客,卻偏偏與公主長得像,于是被迫代替她去往敵國和親约郁。 傳聞我的和親對象是個殘疾皇子缩挑,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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