V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
youmoo
V2EX  ›  JavaScript

怎么编写一个同时支持 callback 和 promise 风格的函数

  •  
  •   youmoo · 2020-09-11 13:37:13 +08:00 · 2256 次点击
    这是一个创建于 698 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设给出如下代码模板:

    // 一个异步函数
    function someFun(callback) {}
    
    // 可以传 callback 执行
    someFun(console.log);
    
    // 可以返回 Promise
    someFun().then(console.log);
    

    someFun函数要如何编写才能支持 2 种调用风格呢?

    我写了篇文章进行详细介绍,欢迎拍砖。

    JavaScript: 如何编写一个既支持 Callback 又支持 Promise 风格的函数

    11 条回复    2020-09-11 17:02:21 +08:00
    moult
        1
    moult  
       2020-09-11 13:44:29 +08:00 via iPhone   ❤️ 4
    var a=new promise(...);
    if(callback) a.then(callback) else return a;
    youmoo
        2
    youmoo  
    OP
       2020-09-11 13:55:41 +08:00
    @moult 可行。不过可以优先 callback, 无 callback 时再 new promise,这样可以省一个 promise 。
    youmoo
        4
    youmoo  
    OP
       2020-09-11 13:58:19 +08:00
    @zhuangzhuang1988 嗯。很多库或框架都有用到这种风格。
    tikazyq
        5
    tikazyq  
       2020-09-11 14:01:11 +08:00
    typeof 应该可以解决你的问题
    flowfire
        6
    flowfire  
       2020-09-11 14:21:52 +08:00
    这。。。。感觉像是 promisify ?
    正常情况就是判断参数是否存在吧
    lovecy
        7
    lovecy  
       2020-09-11 14:55:04 +08:00
    typof callback === "function"
    tangchi695
        8
    tangchi695  
       2020-09-11 15:00:49 +08:00
    判断有没有 callback 不就完事儿了吗
    momocraft
        9
    momocraft  
       2020-09-11 15:17:50 +08:00
    不管有没有 callback 都返回 promise
    如果有 callback 就 then 一份
    lin07hui
        10
    lin07hui  
       2020-09-11 16:57:30 +08:00
    function someFun(callback) {
    const res = { data: "..." };
    typeof callback === "function" && callback(res);
    return Promise.resolve(res);
    }
    hupo0
        11
    hupo0  
       2020-09-11 17:02:21 +08:00
    @youmoo 连返回类型都不一样了,最好分开成两个函数
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4241 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 05:54 · PVG 13:54 · LAX 22:54 · JFK 01:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.