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

Analisis mendalam fungsi util.promisify() dalam Node

青灯夜游
Lepaskan: 2023-04-12 17:56:15
ke hadapan
1511 orang telah melayarinya

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'
});
Salin selepas log masuk

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'
Salin selepas log masuk

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'
Salin selepas log masuk

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` 实例!
Salin selepas log masuk

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
Salin selepas log masuk

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!

Label berkaitan:
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan