node-mysqlのコールバック地獄をES6 GeneratorとPromiseでなんとかする

node-mysqlのコールバック地獄をthunkifyでなんとかする でやったthunkify使わずにPromiseでやるやつです。

thunkifyより柔軟な処理ができるかもしれません。
db.query(‘SELECT … ‘, function(err, rows) {}) の代わりにPromiseな db.exec() も同じように用意してます。

'use strict';
// pool connection + Promise
var mysql = require('mysql2'),
    pool;

function getPoolConnection() {
    if (!pool) pool = mysql.createPool({host: '***', user: '***', password: '***'});
     return new Promise(function(resolve, reject) {
         pool.getConnection(function(err, connection) {
             if (err) {
                 reject(err);
             } else {
                 // conn.exec = <Promise>
                 connection.exec = function(query) {
                     return new Promise(function(res, rej) {
                         connection.query(query, function(err, rows) {
                             err ? rej(err) : res(rows);
                         });
                     });
                 }
                 resolve(connection);
             }
         });
     });
}
// then, catchを使う…… と、あまり変わらないけれど
function example1() {
    getPoolConnection()
        .then(function(db) {
            db.exec('SELECT * FROM ... ')
              .then(function(rows) {
                  console.log(rows);
                  db.release();
              })
        })

}

// generator functionを使う
function* example2() {
    var db = yield getPoolConnection();
    var res = yield db.exec('SELECT * FROM ....');
    console.log(res);
    db.release();
}

// coでもいい
co(function* () {
    var db = yield getPoolConnection();
    var res = yield db.exec('SELECT * FROM ....');
    console.log(res);
    db.release();
})

UserScriptLoader.uc.jsの@requireが動かない

@requireでjQueryやunderscore.jsを読み込んでるユーザースクリプトを使うとき、requireディレクトリにキャッシュがない場合、saveURI()で失敗するようになってます。
調べるとFirefox 36以降でパラメータが増えてるのが原因っぽいです。

void saveURI(
  in nsIURI aURI,
  in nsISupports aCacheKey,
  in nsIURI aReferrer,
  in long aReferrerPolicy,
  in nsIInputStream aPostData,
  in string aExtraHeaders,
  in nsISupports aFile,
  in nsILoadContext aPrivacyContext
);

ということで wbp.saveURI(uri, null, null, null, null, aFile, null); となってる箇所の4番目(in long aReferrerPolicy)に null を追加すると保存されます。

	wbp.persistFlags = Ci.nsIWebBrowserPersist.PERSIST_FLAGS_BYPASS_CACHE;
	wbp.persistFlags |= Ci.nsIWebBrowserPersist.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION;
	wbp.saveURI(uri, null, null, null, null, null, aFile, null);
	USL.debug("getContents: " + aURL);

同じようにメニューのSave Scriptをクリックしたときに保存できないのもsaveURIのパラメータが足りないからです。
こんな感じで null 追加。

			var loadContext = win.QueryInterface(Ci.nsIInterfaceRequestor)
				.getInterface(Ci.nsIWebNavigation)
				.QueryInterface(Ci.nsILoadContext);
			wbp.saveURI(uri, null, uri, null, null, null, fp.file, loadContext);

XPCOM廃止するとか言ってんのに今さら仕様変更すんなよ……。