初学 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);
        });
    });
};

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

你可能感兴趣的文章

SwenChan · 2016年03月30日

resolve(result); callback &&a callback(null, result);return;

回复

王道中强流 作者 · 2016年03月30日

不错!但是一个方法内 如果有好几个调用callback的地方,那这么改起来就很麻烦了。

回复

红叶舞秋山 · 2016年08月12日

复杂了吧。一楼的简单

回复

vritser · 2016年08月17日

没看懂。。帮忙解释一下 1楼怎么改。

回复

载入中...
王道中强流 王道中强流

1.5k 声望

发布于专栏

王道中强流

不为繁华易匠心

7 人关注