Rumah >hujung hadapan web >tutorial js >Analisis mendalam fungsi util.promisify() dalam Node

Analisis mendalam fungsi util.promisify() dalam Node

青灯夜游
青灯夜游ke hadapan
2023-04-12 17:56:151486semak imbas

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.

Analisis mendalam fungsi util.promisify() dalam Node

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'

Pelaksanaan mudah

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

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!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam