摘要:例如,的回調(diào)函數(shù)包含下面幾個(gè)參數(shù)轉(zhuǎn)換成之后,它的參數(shù)將會(huì)變成這樣一個(gè)對(duì)象通過(guò)內(nèi)部符號(hào)處理非標(biāo)準(zhǔn)回調(diào)函數(shù)。
Nodejs 8 有一個(gè)新的工具函數(shù) util.promisify()。他將一個(gè)接收回調(diào)函數(shù)參數(shù)的函數(shù)轉(zhuǎn)換成一個(gè)返回Promise的函數(shù)。
1、util.promisify()小例子如果你給以下命令傳入文件路徑,則會(huì)輸出文件內(nèi)容
// echo.js const {promisify} = require("util"); const fs = require("fs"); const readFileAsync = promisify(fs.readFile); // (A) const filePath = process.argv[2]; readFileAsync(filePath, {encoding: "utf8"}) .then((text) => { console.log("CONTENT:", text); }) .catch((err) => { console.log("ERROR:", err); });
注意:在第一行,程序使用promisify()轉(zhuǎn)換基于回調(diào)函數(shù)的方法fs.readFile()成一個(gè)返回promise的一個(gè)函數(shù)
下面的代碼片段顯示這個(gè)腳本如何使用的
$ node echo.js echo.js CONTENT: const {promisify} = require("util"); ··· $ node echo.js unknown.txt ERROR: { Error: ENOENT: no such file or directory, ··· }2、使用async函數(shù)
同樣的功能,但是通過(guò)async函數(shù)實(shí)現(xiàn)
// echoa.js const {promisify} = require("util"); const fs = require("fs"); const readFileAsync = promisify(fs.readFile); const filePath = process.argv[2]; async function main() { try { const text = await readFileAsync(filePath, {encoding: "utf8"}); console.log("CONTENT:", text); } catch (err) { console.log("ERROR:", err); } } main();3、轉(zhuǎn)換有多個(gè)參數(shù)的回調(diào)函數(shù)為Promise
下面的函數(shù)的回調(diào)函數(shù)接收多于一個(gè)的參數(shù)(除了error參數(shù))
child_process.exec
child_process.execFile
dns.lookup
dns.lookupService
fs.read
fs.write
如果你轉(zhuǎn)換這些函數(shù)為promise,它會(huì)返回一個(gè)對(duì)象(由多個(gè)參數(shù)組成的對(duì)象,而不是一個(gè)值)。例如,dns.lookup的回調(diào)函數(shù)包含下面幾個(gè)參數(shù)
err : Error
address : string
family : integer
轉(zhuǎn)換成Promise之后,它的參數(shù)將會(huì)變成{address, family}這樣一個(gè)對(duì)象
const util = require("util"); const dns = require("dns"); const lookupAsync = util.promisify(dns.lookup); lookupAsync("nodejs.org") .then(obj => console.log(obj)); // { address: "104.20.23.46", family: 4 }
promisify()通過(guò)內(nèi)部符號(hào)internal/util/customPromisifyArgs處理非標(biāo)準(zhǔn)回調(diào)函數(shù)。因此不推薦傳入一個(gè)非標(biāo)準(zhǔn)的回調(diào)函數(shù),也不應(yīng)該去轉(zhuǎn)換我們自己實(shí)現(xiàn)的回調(diào)(ps:自己就直接寫Promise就好了。。。)
4、定制的Promise函數(shù)promisified的API來(lái)源于util.promisify.custom,它允許您將一個(gè)promisified版本附加到一個(gè)基于回調(diào)的函數(shù)。 在以下示例中,fooAsync是foo的promisified版本
const util = require("util"); function foo() { return "abc"; } async function fooAsync() { return "abc"; } foo[util.promisify.custom] = fooAsync; console.log(util.promisify(foo) === fooAsync); // true4.1 定制了promisified版本的標(biāo)準(zhǔn)函數(shù)
現(xiàn)在,有兩個(gè)標(biāo)準(zhǔn)函數(shù)有定制的promisified版本
> setImmediate[util.promisify.custom] [Function] > setTimeout[util.promisify.custom] [Function]5、低版本node兼容庫(kù)
Jordan Harband寫了一個(gè)庫(kù)a polyfill for util.promisify(),用來(lái)兼容promisify,使用方法如下
需要注意:
js必須支持es5以上語(yǔ)法
必須支持Promise
待完善中
安裝
npm install util.promisify
使用方式有兩種
第一種,檢查是否有內(nèi)置實(shí)現(xiàn)(Node 8)或者使用 polyfill (舊的Node版本)
const promisify = require("util.promisify"); const fs = require("fs"); const readFileAsync = promisify(fs.readFile);
第二種,在舊版本的Node上使用補(bǔ)丁模塊
const util = require("util"); require("util.promisify").shim(); const fs = require("fs"); const readFileAsync = util.promisify(fs.readFile);
翻譯自 Node.js 8: util.promisify()
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/87044.html
摘要:我們就可以升級(jí)以前所有的異步回調(diào)函數(shù)了。大體上來(lái)說(shuō),這套方案通過(guò)使用回調(diào)實(shí)例包裹原先的回調(diào)函數(shù),可以將原先復(fù)雜的嵌套展開鋪平,從而降低開發(fā)和維護(hù)的難度和成本。 Node.js 8 于上個(gè)月月底正式發(fā)布,帶來(lái)了很多新特性。其中比較值得注意的,便有 util.promisify() 這個(gè)方法。 如果你已經(jīng)很熟悉 Promise,請(qǐng)繼續(xù)往下看。如果你還不熟悉 Promise,可以先跳過(guò)去看下...
摘要:自定義的化有那么一些場(chǎng)景,是不能夠直接使用來(lái)進(jìn)行轉(zhuǎn)換的,有大概這么兩種情況沒(méi)有遵循約定的回調(diào)函數(shù)返回多個(gè)參數(shù)的回調(diào)函數(shù)首先是第一個(gè),如果沒(méi)有遵循我們的約定,很可能導(dǎo)致的誤判,得不到正確的反饋。 util.promisify是在node.js 8.x版本中新增的一個(gè)工具,用于將老式的Error first callback轉(zhuǎn)換為Promise對(duì)象,讓老項(xiàng)目改造變得更為輕松。 在官方推...
摘要:定時(shí)器在和瀏覽器中的表現(xiàn)形式是相同的。關(guān)于定時(shí)器的一個(gè)重要的事情是,我們提供的延遲不代表在這個(gè)時(shí)間之后回調(diào)就會(huì)被執(zhí)行。它的真正含義是,一旦主線程完成所有操作包括微任務(wù)并且沒(méi)有其它具有更高優(yōu)先級(jí)的定時(shí)器,將在此時(shí)間之后執(zhí)行回調(diào)。 眾成翻譯 原文鏈接 關(guān)于作者 2018年6月21日出版? 本指南面向了解Javascript但尚未十分熟悉Node.js的前端開發(fā)人員。我這里不專注于語(yǔ)言本身...
摘要:一個(gè)包括文件緩存?zhèn)鬏攭嚎s模版引擎類型匹配等功能的靜態(tài)資源服務(wù)器,使用的內(nèi)置模塊實(shí)現(xiàn),可以通過(guò)鏈接訪問(wèn)資源。二使用讀取資源文件我們的目的是搭建一個(gè)靜態(tài)資源服務(wù)器,當(dāng)訪問(wèn)一個(gè)到資源文件或目錄時(shí),我們希望可以得到它。 一個(gè)包括文件緩存、傳輸壓縮、ejs 模版引擎、MIME 類型匹配等功能的 Node 靜態(tài)資源服務(wù)器,使用 Node 的內(nèi)置模塊實(shí)現(xiàn),可以通過(guò)鏈接訪問(wèn)資源。 一、創(chuàng)建 HTTP Se...
摘要:控制臺(tái)將顯示回調(diào)地獄通常,回調(diào)只能由一個(gè)異步函數(shù)調(diào)用。更多資源使更友好規(guī)范使用異步函數(shù)簡(jiǎn)化異步編碼旅程異步編程是一項(xiàng)在中無(wú)法避免的挑戰(zhàn)。 JavaScript經(jīng)常聲稱是_異步_。那是什么意思?它如何影響發(fā)展?近年來(lái)這種方法有何變化? 請(qǐng)思考以下代碼: result1 = doSomething1(); result2 = doSomething2(result1); 大多數(shù)語(yǔ)言都處理每...
閱讀 1438·2021-11-22 15:24
閱讀 2533·2021-10-11 11:06
閱讀 2339·2021-10-09 09:45
閱讀 2538·2021-09-09 09:33
閱讀 645·2019-08-30 15:53
閱讀 1449·2019-08-30 12:48
閱讀 689·2019-08-29 13:47
閱讀 512·2019-08-26 18:27