Rumah >hujung hadapan web >tutorial js >Analisis mendalam fungsi util.promisify() dalam Node
Pakej penggunaan terbina dalam Node.js mempunyai fungsi promisify() yang boleh menukar fungsi berasaskan panggilan balik kepada fungsi berasaskan Promise. Artikel ini akan memperkenalkan anda kepada fungsi util.promisify() dalam Node.js saya harap ia akan membantu anda.
membolehkan anda menggunakan Promise chaining dan async/wait dengan API berasaskan panggil balik.
Sebagai contoh, pakej fs Node.js menggunakan panggilan balik. Biasanya, membaca fail memerlukan penggunaan panggilan balik:
const fs = require('fs'); fs.readFile('./package.json', function callback(err, buf) { const obj = JSON.parse(buf.toString('utf8')); obj.name; // 'masteringjs.io' });
Anda boleh menggunakan util.promisify()
untuk menukar fungsi fs.readFile()
kepada fungsi yang mengembalikan Janji. [Cadangan tutorial berkaitan: tutorial video nodejs, Pengajaran pengaturcaraan]
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()
Bagaimana ia berfungsi secara dalaman ? Terdapat polyfill pada npm dan anda boleh baca pelaksanaan penuh di sini. Anda juga boleh mencari pelaksanaan Node.js di sini, tetapi untuk tujuan pendidikan polyfill lebih mudah dibaca. Idea teras
util.promisify()
ialah menambah fungsi panggil balik berdasarkan parameter yang anda lalui. Fungsi panggil balik ini menyelesaikan atau menolak Janji yang dikembalikan oleh fungsi yang dijanjikan.
agak bertele-tele, berikut ialah versi pelaksanaan ringkas kaedah 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'
Bagaimana anda faham? Mula-mula, util.promisify()
akan menambah 1 parameter tambahan pada parameter yang anda lalui, dan kemudian memanggil fungsi asal dengan parameter baharu ini. Kemudian fungsi asas mesti menyokong bilangan panggilan parameter ini Contohnya: jika anda memanggil fungsi yang dijanjikan [String,Object]
dengan 2 parameter jenis myFn()
, sila pastikan fungsi asal menyokong tandatangan panggilan [String, Object, Function]
.
Kedua, util.promisify()
mempunyai kesan pada konteks fungsi.
Konteks Kehilangan bermakna nilai this
dalaman tidak betul apabila fungsi dipanggil. Kehilangan konteks ialah masalah biasa dengan fungsi yang diubah:
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
mewakili objek yang fungsi itu dipanggil. Oleh itu, anda boleh mengekalkan konteks dengan menetapkan fungsi yang dijanjikan kepada sifat objek yang sama:
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
Untuk lebih banyak pengetahuan berkaitan nod, sila lawati: tutorial nodejs!
Atas ialah kandungan terperinci Analisis mendalam fungsi util.promisify() dalam Node. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!