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

但不晓得这类写法 是不是充足智慧,迎接指教。

    原文作者:王道中强流
    原文地址: https://segmentfault.com/a/1190000004716793
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞