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