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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值