Nodeへutil.promisify()の追加
add util.promisify()がそろそろ入りそう(承認の既定値越した) https://t.co/AdSMtzTgS6
— hiroppy😶soliste (@about_hiroppy) 2017年4月27日
ということで久しぶりに記事を書くことにした。
4/24のNode学園でも少し話したが、自分がとても注目している追加です。
Node8への変更点を見たい方はスライド見てください。
本題
簡単に話すと、今までコールバックだったのがこのutil.promisify()
を使うことによりPromiseと同じように扱えるということ。
これだけでかなりすごい。今までコールバック内でresolveしていたのだからそこのPromise用の関数を作らなくてもよくなるのはとても楽だ。
child_process
, dns
, fs
, timers
に対応している。
util.promisify()
のリファレンス
node/util.md at aab71bd565662446622f36a011ce956a451b7be5 · addaleax/node · GitHub
まだマージされていないのでmasterではなく個人へ向けられています
さて、このPRは承認規定数を越したのでそろそろ着陸され、次の8.0.0への凍結前(5/9)にmasterへ入ると思われる。
例
const util = require('util'); const exec = require('child_process').exec; /** * CallBack */ exec('ls', (err, stdout, stderr) => { if (err) console.error(err); console.log('stdout:', stdout); console.log('stderr:', stderr); }); /** * Promise */ function execLS() { return new Promise((resolve, reject) => { exec('ls', (err, stdout, stderr) => !err ? resolve(stdout, stderr) : reject(err) ); }) } execLS().then((stdout, stderr) => { console.log('stdout:', stdout); console.log('stderr:', stderr); }).catch((err) => { console.error(err); }); /** * util.promisify() */ const execPromise = util.promisify(exec); // ここでexecをPromiseにする // async/await Node7.6.0 ~ (async () => { const { stdout, stderr } = await execPromise('ls'); console.log('stdout:', stdout); console.log('stderr:', stderr); })(); const setImmediatePromise = util.promisify(setImmediate); setImmediatePromise('foobar').then((value) => { console.log(value) });
このようにPromiseになるので、async/awaitのようにも使えるし今までのようにthen()
でつなげることもできるようになった。
また今、whatwg-consoleの実装が着実に進んでいるのでこちらも注目すると良さそう。
6時間前に console.count()
, console.clear()
の実装がでた。
github.com
github.com