メソッドをPromiseに変換する
util.promisify
を使うとメソッドをPromiseに変換してくれます。
次のコードは fs.readFile
をPromiseに変換する例です。util.promisify
でラップした結果、.then
や .catch
といったPromiseのAPIが使えるようになっています。
const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);
readFile('test.txt', 'utf-8')
.then(file => {
console.log(file);
})
.catch(err => {
throw err;
})
util.promisify
を使うための条件
util.promisify
を使うためにはその関数やメソッドが次の条件を満たしている必要があります。
- 引数の最後はコールバック関数
- コールバック関数の最初の引数はエラー
上の例で使った fs.readFile
はこの条件を満たしています。
自作関数をPromiseに変換する
条件に従って util.promisify
できる関数を自作してみます。作るのは指定した時間をおいてコールバックを実行する sleep
関数です。
指定した時間を置いてコールバック実行する関数として、 setTimeout
がありますが、 setTimeout
の最後の引数はコールバックではないのでそのままでは util.promisify
を使えません。
そこで setTimeout
をラップした関数を用意します。
function _sleep(time, callback) {
setTimeout(callback, time);
}
この _sleep
関数は最後の引数がコールバックなので、 util.promisify
が使えます。
const util = require('util');
const sleep = util.promisify(_sleep);
_sleep
を util.promisify
でラップして sleep
関数ができました。
次のコードを実行すると1秒間を置いて日時が出力されるのを確認できます。
console.log(new Date())
sleep(1000)
.then(() => {
console.log(new Date());
})