メソッドを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());
})