Promise化,Promisify,将函数改成 既支持Callback回调,又支持Promise

557 查看

初学 Node.js,用 Express 开发 Web 项目。
而且还是个不小的项目,说起来挺冒险的。

一开始比较简单,并没有使用 Promise 也能顺利进行,
随着开发的深入,到了不用 Promise 不行的地步了。

于是产生了一个问题,一些之前写的方法并不支持 Promise
如果直接改成 Promise,那之前调用过的地方也都得改,工作量有点大。
如果加一个 Promise 版,那就有点啰嗦有点丑陋,如下所示:

// 也就是同一个功能,写两个版本
function getInfo(uid, callback) { ... };
function getInfoPromise(uid) { ... };

听说 Bluebird 有个 promisify 方法,可以将方法 Promise 化,
但是又感觉为了这一个方法,多加载一个库,有点浪费内存,
毕竟 Node.js 现在原生的支持 Promise 了,
能不能“人工手动”将函数改成,既支持 Callback 回调,又支持 Promise 呢?
于是有了以下修改:

// 原先只支持 callback 回调版:
var getInfo = function(uid, callback) {
    var sql = "select * from v_user where uid=? limit 1";
    Mysql.query(sql, [uid], function(err, row) {
        if(err) return callback(err);
        if(row.length===0) return callback();

        var info = row[0];
        callback(null, info);
    });
};
// 修改后 既支持 callback 回调,又支持 Promise
var getInfo = function(uid, callback) {
    return new Promise(function(resolve, reject) {
        if (callback) {
            resolve = function (ret) {
                callback(null, ret);
            };
            reject = callback;
        }

        var sql = "select * from v_user where uid=? limit 1";
        Mysql.query(sql, [uid], function(err, row) {
            if(err) return reject(err);
            if(row.length===0) return resolve();

            var info = row[0];
            resolve(info);
        });
    });
};

但不知道这种写法 是否足够聪明,欢迎指教。