Node.js 內建的 util 套件有一個 promisify() 函數,可以將基於回呼的函數轉換為基於 Promise 的函數。本文就來跟大家介紹一下Node.js 中的 util.promisify() 函數,希望對大家有幫助。
讓你可以使用 Promise 鍊式 和 async/await 與基於回呼的 API。
例如,Node.js 的 fs 套件 使用回呼。通常,讀取檔案需要使用回呼方式:
const fs = require('fs'); fs.readFile('./package.json', function callback(err, buf) { const obj = JSON.parse(buf.toString('utf8')); obj.name; // 'masteringjs.io' });
你可以使用util.promisify()
將fs.readFile()
函數轉換為傳回Promise 的函數。 【相關教學推薦:nodejs影片教學、程式設計教學】
const fs = require('fs'); const util = require('util'); // 将 `fs.readFile()` 转换为一个函数,该函数接受相同的参数但返回一个 Promise const readFile = util.promisify(fs.readFile); // 现在可以对 `readFile()` 使用 `await` 了! const buf = await readFile('./package.json'); const obj = JSON.parse(buf.toString('utf8')); obj.name; // 'masteringjs.io'
簡單實作
##util.promisify()在內部是如何運作的?
npm 上有一個 polyfill,你可以 在這裡閱讀完整的實作。你也可以 在這裡找到 Node.js 的實作,不過出於教育目的,polyfill 比較容易閱讀。
util.promisify() 的核心思想是
在你傳遞的參數基礎上加入了一個回呼函數。這個回呼函數解析(resolve)或拒絕(rejected) promisified 函數傳回的 Promise。
util.promisify() 方法一個簡化的實作版本。
const fs = require('fs'); // `util.promisify()` 的简化实现。不涵盖所有情况,不要在生产环境中使用! function promisify(fn) { return function () { const args = Array.prototype.slice.call(arguments); return new Promise((resolve, reject) => { fn.apply(this, [].concat(args).concat([(err, res) => { if (err) { return reject(err); } resolve(res); }])); }); } } // 将 `fs.readFile()` 转换为一个函数,该函数接受相同的参数但返回一个 Promise const readFile = util.promisify(fs.readFile); // 现在可以对 `readFile()` 使用 `await` 了! const buf = await readFile('./package.json'); const obj = JSON.parse(buf.toString('utf8')); obj.name; // 'masteringjs.io'怎麼理解?首先,
util.promisify() 會向你傳遞的參數新增 1 個額外參數,然後使用這些新參數呼叫原始函數。那麼底層函數就要支援這些數量的參數調用,舉例:如果你正在使用類型為
[String,Object] 的2 個參數調用promisified 函數
myFn(),請確保原始函數支援呼叫簽名
[String, Object, Function]。
util.promisify() 對於
函數上下文 有影響。
遺失上下文(Losing Context) 表示呼叫函數時內部 this 值不正確 。遺失上下文是轉換後的函數的常見問題:
class MyClass { myCallbackFn(cb) { cb(null, this); } } const obj = new MyClass(); const promisified = require('util').promisify(obj.myCallbackFn); const context = await promisified(); context; // 打印 `undefined` 而非 `MyClass` 实例!
this 表示函數被呼叫時所屬的物件
。因此,你可以透過將 promisified 函數設定為相同物件的屬性來保留上下文:
class MyClass { myCallbackFn(cb) { cb(null, this); } } const obj = new MyClass(); // 保留上下文,因为 `promisified` 是 `obj` 的一个属性 obj.promisified = require('util').promisify(obj.myCallbackFn); const context = await obj.promisified(); context === obj; // true更多node相關知識,請造訪:
nodejs 教學!
以上是深入淺析Node中的util.promisify()函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),