技術探し

JavaScriptを中心に記事を書いていきます :;(∩´﹏`∩);:

Nodeへutil.promisify()の追加

ということで久しぶりに記事を書くことにした。

4/24のNode学園でも少し話したが、自分がとても注目している追加です。
Node8への変更点を見たい方はスライド見てください。

abouthiroppy.github.io

本題

github.com github.com

簡単に話すと、今までコールバックだったのがこの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