Node.js 8 于上個月月底正式發(fā)布,帶來了 很多新特性 。其中比較值得注意的,便有 util.promisify() 這個方法。
在潮陽等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計、做網(wǎng)站 網(wǎng)站設(shè)計制作按需設(shè)計網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,成都全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站建設(shè)公司,潮陽網(wǎng)站建設(shè)費用合理。
util.promisify()
雖然 Promise 已經(jīng)普及,但是 Node.js 里仍然有大量的依賴回調(diào)的異步函數(shù),如果我們每個函數(shù)都封裝一次,也是齁麻煩齁麻煩的,比齁還麻煩。
所以 Node8 就提供了 util.promisify() 這個方法,方便我們快捷的把原來的異步回調(diào)方法改成返回 Promise 實例的方法,接下來,想繼續(xù)用隊列,還是 await 就看需要了。
我們看下范例:
const util = require('util'); const fs = require('fs'); const stat = util.promisify(fs.stat); stat('.') .then((stats) => { // Do something with `stats` }) .catch((error) => { // Handle the error. });
怎么樣,很簡單吧?按照文檔中的說法,只要符合 Node.js 的回調(diào)風(fēng)格,所有函數(shù)都可以這樣轉(zhuǎn)換。也就是說,滿足下面兩個條件即可。
結(jié)合 Await/Async 使用
同樣是上面的例子,如果想要結(jié)合 Await/Async,可以這樣使用:
const util = require('util'); const fs = require('fs'); const stat = util.promisify(fs.stat); async function readStats(dir) { try { let stats = await stat(dir); // Do something with `stats` } catch (err) { // Handle the error. console.log(err); } } readStats('.');
自定義 Promise 化處理函數(shù)
那如果函數(shù)不符合這個風(fēng)格,還能用 util.promisify() 么?答案也是肯定的。我們只要給函數(shù)增加一個屬性,util.promisify.custom
,指定一個函數(shù)作為 Promise 化處理函數(shù),即可。請看下面的代碼:
const util = require('util'); function doSomething(foo, callback) { // ... } doSomething[util.promisify.custom] = function(foo) { return getPromiseSomehow(); }; const promisified = util.promisify(doSomething); console.log(promisified === doSomething[util.promisify.custom]); // prints 'true'
如此一來,任何時候我們對目標(biāo)函數(shù) doSomething 進行 Promise 化處理,都會得到之前定義的函數(shù)。運行它,就會按照我們設(shè)計的特定邏輯返回 Promise 實例。
我們就可以升級以前所有的異步回調(diào)函數(shù)了。
Promise 介紹
因為種種歷史原因,JS 當(dāng)中有大量異步函數(shù)。這些異步函數(shù),大多要依賴回調(diào)進行處理(這里我覺得把事件偵聽算作回調(diào)也是合理的),但是回調(diào)嵌套層次一多,就會形成所謂的“回調(diào)陷阱”,讓開發(fā)者苦不堪言。
為了解決這個問題,開發(fā)社區(qū)經(jīng)過摸索,總結(jié)出來一套名為 Promise/A+ 的解決方案。大體上來說,這套方案通過使用 “Promise 回調(diào)實例”包裹原先的回調(diào)函數(shù),可以將原先復(fù)雜的嵌套展開、鋪平,從而降低開發(fā)和維護的難度和成本。
new Promise( (resolve, reject) => { // 構(gòu)建一個 Promise 實例 someAsyncFunction( (err, result) => { // 調(diào)用原來的異步函數(shù) if (err) { // 發(fā)生錯誤,進入錯誤處理模式 return reject(err); } resolve(result); // 一切正常,進入隊列的下一環(huán)節(jié) }); }) .then( result => { // 下一環(huán)節(jié) return doSomething(result); }) .then( result2 => { // 又下一環(huán)節(jié) return doSomething2(result2); }) ... // 各種中間環(huán)節(jié) .catch( err => { // 錯誤處理 console.log(err); });
ES2015(ES6)里包含了 Promise 標(biāo)準(zhǔn),如今已經(jīng)在大部分運行時里實裝,我們可以放心大膽的使用它。而且,由于 Promise 不需要新的語法元素,所以即使在不支持原生 Promise 的環(huán)境里也可以使用類庫,比如 Q 或者 Bluebird ,甚至 jQuery 。
在小程序里也有效喲。
ES2017 增加了 Await/Async 語法,但請注意, Await 后面必須跟 Promise 實例才能實現(xiàn)異步。所以,大家還是把 Promise 的概念學(xué)好吧!
function resolveAfter2Seconds(x) { return new Promise(resolve => { setTimeout(() => { resolve(x); }, 2000); }); } async function f1() { var x = await resolveAfter2Seconds(10); console.log(x); // 10 } f1();
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
名稱欄目:Node.js8中的util.promisify的詳解
文章起源:http://jinyejixie.com/article44/poshee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站收錄、商城網(wǎng)站、動態(tài)網(wǎng)站、云服務(wù)器、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)