资讯专栏INFORMATION COLUMN

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

wushuiyong / 1972人阅读

摘要:初学,用开发项目。而且还是个不小的项目,说起来挺冒险的。一开始比较简单,并没有使用也能顺利进行,随着开发的深入,到了不用不行的地步了。于是产生了一个问题,一些之前写的方法并不支持,如果直接改成,那之前调用过的地方也都得改,工作量有点大。

初学 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://www.ucloud.cn/yun/79055.html

相关文章

  • Node.js 8 中的 `util.promisify`

    摘要:我们就可以升级以前所有的异步回调函数了。大体上来说,这套方案通过使用回调实例包裹原先的回调函数,可以将原先复杂的嵌套展开铺平,从而降低开发和维护的难度和成本。 Node.js 8 于上个月月底正式发布,带来了很多新特性。其中比较值得注意的,便有 util.promisify() 这个方法。 如果你已经很熟悉 Promise,请继续往下看。如果你还不熟悉 Promise,可以先跳过去看下...

    HackerShell 评论0 收藏0
  • util.promisify 的那些事儿

    摘要:自定义的化有那么一些场景,是不能够直接使用来进行转换的,有大概这么两种情况没有遵循约定的回调函数返回多个参数的回调函数首先是第一个,如果没有遵循我们的约定,很可能导致的误判,得不到正确的反馈。 util.promisify是在node.js 8.x版本中新增的一个工具,用于将老式的Error first callback转换为Promise对象,让老项目改造变得更为轻松。 在官方推...

    shuibo 评论0 收藏0
  • CallbackPromise 间的桥梁 —— promisify

    摘要:今天要介绍的是,就是回调函数与间的桥梁。什么样的叫有两个条件回调函数在主函数中的参数位置必须是最后一个回调函数参数中的第一个参数必须是。 作者:晃晃本文原创,转载请注明作者及出处 Promise 自问世以来,得到了大量的应用,简直是 javascript 中的神器。它很好地解决了异步方法的回调地狱、提供了我们在异步方法中使用 return 的能力,并将 callback 的调用纳入了自...

    RayKr 评论0 收藏0
  • 再谈Promise

    摘要:方法完成回调注册模式下,对象通过方法调用,注册完成态和失败态的回调函数。这些回调函数组成一个回调队列,处理的值。调用实例的方法,能使注册的回调队列中的回调函数依次执行。 之前写了一篇关于ES6原生Promise的文章。近期又读朴灵的《深入浅出Node》,里面介绍了一个Promise/Deferred模式。 Promise是解决异步问题的利器。它其实是一种模式。Promise有三种状态,...

    chenjiang3 评论0 收藏0
  • Promisify 的源码解析

    摘要:参考文档升级后的函数回调参数问题中的使用方法和还是不一样的源码讲解的内部机制优化相关内容文章官方文档简述使用过的都知道这个方法的作用,通过该方法会让形式的函数风格转换成方法,可以认为是一颗语法糖,例如接下来我们就分析一下这个的内部流程。 参考文档 升级bluebird 3后Promise.promisify的函数回调参数问题:3中的使用方法和2还是不一样的 How does Bl...

    gougoujiang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<