クイックリファレンス

Q.js Promise チートシート

Q.js のクイックリファレンス:Node.js とブラウザ向けの歴史的 Promise ライブラリ、nfcall によるコールバックの Promise 化、配列コンビネータの解説。

· 公開日

[!NOTE] 歴史的なライブラリについて: Q は、ネイティブの ES2015 Promise や async/await が JavaScript エンジンに標準搭載される前の基礎的な Promises/A+ 実装ライブラリです。

Q は、Node.js およびブラウザ向けに設計された Promise ライブラリです。

Promise の生成

const Q = require('q');

function asyncAction() {
  const deferred = Q.defer();

  fs.readFile('data.txt', 'utf8', (err, data) => {
    if (err) deferred.reject(err);
    else deferred.resolve(data);
  });

  return deferred.promise;
}

Nodeback(コールバック)の Promise 変換

Q は、Node.js 標準のコールバック形式 (err, result) を Promise に変換するユーティリティを提供します:

const fs = require('fs');

// Q.nfcall: Node Function Call(Node 形式関数を直接呼び出し)
Q.nfcall(fs.readFile, 'file.txt', 'utf-8')
  .then((data) => console.log(data))
  .catch((err) => console.error(err));

// Q.denodeify: コールバック関数を Promise を返す関数にラップ
const readFile = Q.denodeify(fs.readFile);
readFile('file.txt', 'utf-8').then(console.log);

配列コンビネータ

// Q.all: すべての Promise が解決するのを待機
Q.all([stepA(), stepB()])
  .then(([resA, resB]) => {
    console.log(resA, resB);
  });

// Q.allSettled: 成否に関係なくすべての Promise の完了を待機
Q.allSettled([stepA(), stepB()])
  .then((results) => {
    results.forEach((r) => {
      if (r.state === 'fulfilled') console.log(r.value);
      else console.error(r.reason);
    });
  });

参考リンク

関連テーマ