ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js util モジュールの promisify() メソッドの詳細

Node.js util モジュールの promisify() メソッドの詳細

青灯夜游
青灯夜游転載
2021-08-27 10:33:233176ブラウズ

Node.js util モジュールの promisify() メソッドの詳細

Node.js 組み込みの util モジュールには promisify() メソッド##があります#, このメソッドは、コールバックベースの関数を Promise ベースの関数に変換します。これにより、コールバックベースの API で Promise チェーンと async/await を使用できるようになります。

たとえば、Node.js の

fs モジュールは、ファイルを読み取るときにコールバックを使用する必要があります。

const fs = require('fs')

fs.readFile('./package.json', function callback(err, buf) {
  const obj = JSON.parse(buf.toString('utf8'))
  console.log(obj.name) // 'Example' -> package.json 包名
})

util.promisify() を使用できます。 fs.readFile() のコールバック関数を Promise を返す関数に変換します。

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'))
console.log(obj.name) // 'Example'

promise はどのように機能しますか?

util.promisify() バックグラウンドでどのように動作するのでしょうか? npm には polyfill があり、ここで 完全な実装を読むことができます。 Node.js 実装 もここにありますが、理解を容易にするために、ポリフィルの方が読みやすいです。 [推奨学習: "nodejs チュートリアル"]

util.promisify() その背後にある重要なアイデアは、受信パラメータにコールバック関数を追加する#です。 ##。このコールバック関数は、promise 関数によって返された Promise を解決または拒否します。 理解を容易にするために、非常に単純化した

util.promisify()

カスタム実装例を以下に示します。 <pre class="brush:js;toolbar:false;">const fs = require(&amp;#39;fs&amp;#39;) // util.promisify() 的简化实现。不包括所有情况,不要在 prod 环境中使用此选项! function promisify(fn) { return function() { const args = Array.prototype.slice.call(arguments) return new Promise((resolve, reject) =&gt; { fn.apply(this, [].concat(args).concat([(err, res) =&gt; { if (err != null) { return reject(err) } resolve(res) }])) }) } } // 将 fs.readFile() 转换为一个接受相同参数但返回 Promise 的函数。 const readFile = promisify(fs.readFile) // 现在可以将 readFile() 与 await 一起使用! const buf = await readFile(&amp;#39;./package.json&amp;#39;) const obj = JSON.parse(buf.toString(&amp;#39;utf8&amp;#39;)) console.log(obj.name) // &amp;#39;Example&amp;#39;</pre>これは何を意味するのでしょうか?まず、

util.promisify()

は、渡されたパラメーターに 1 つの追加パラメーターを追加し、これらの新しいパラメーターを使用して元の関数を呼び出します。これは、基礎となる関数がその数のパラメーターをサポートする必要があることを意味します。したがって、2 つの型パラメータ [String, Object] を持つ約束された関数 myFn() を呼び出す場合は、元の関数が [String, Object, Function] # をサポートしていることを確認してください。 ##。 それでは、これは何を意味するのでしょうか?まず、util.promisify()

は、渡されたパラメーターに追加のパラメーターを追加し、これらの新しいパラメーターを使用して元の関数を呼び出します。これは、基礎となる関数がその数のパラメーターをサポートする必要があることを意味します。したがって、タイプ

[String, Object] の 2 つの引数を指定して約束された関数 myFn() を呼び出す場合は、元の関数が [String, Object, Function]# をサポートしていることを確認してください。 ##。 2 番目に、util.promisify() は関数コンテキスト (

this

) に影響を与えます。 コンテキストの喪失コンテキストの喪失 (

this

) は、関数呼び出しが間違った値で終了したことを意味します。コンテキストの喪失は、キャスト関数の一般的な問題です。

class MyClass {
  myCallbackFn(cb) {
    cb(null, this)
  }
}

const obj = new MyClass()
const promisified = require(&#39;util&#39;).promisify(obj.myCallbackFn)

const context = await promisified()
console.log(context) // 打印 undefined 而不是 MyClass 实例!

this は、関数が呼び出されたときにプロパティを含むオブジェクトであることに注意してください。したがって、約束された関数を同じオブジェクトのプロパティに設定することでコンテキストを保持できます。

class MyClass {
  myCallbackFn(cb) {
    cb(null, this)
  }
}

const obj = new MyClass()
// 保留上下文,因为 promisified 是 obj 的属性
obj.promisified = require(&#39;util&#39;).promisify(obj.myCallbackFn)

const context = await obj.promisified()
console.log(context === obj) // true

プログラミング関連の知識の詳細については、プログラミング ビデオをご覧ください。 !

以上がNode.js util モジュールの promisify() メソッドの詳細の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。