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

2020-09-11 13:37:13 +08:00
 youmoo

假设给出如下代码模板:

// 一个异步函数
function someFun(callback) {}

// 可以传 callback 执行
someFun(console.log);

// 可以返回 Promise
someFun().then(console.log);

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

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

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

2707 次点击
所在节点    JavaScript
11 条回复
moult
2020-09-11 13:44:29 +08:00
var a=new promise(...);
if(callback) a.then(callback) else return a;
youmoo
2020-09-11 13:55:41 +08:00
@moult 可行。不过可以优先 callback, 无 callback 时再 new promise,这样可以省一个 promise 。
zhuangzhuang1988
2020-09-11 13:55:41 +08:00
youmoo
2020-09-11 13:58:19 +08:00
@zhuangzhuang1988 嗯。很多库或框架都有用到这种风格。
tikazyq
2020-09-11 14:01:11 +08:00
typeof 应该可以解决你的问题
flowfire
2020-09-11 14:21:52 +08:00
这。。。。感觉像是 promisify ?
正常情况就是判断参数是否存在吧
lovecy
2020-09-11 14:55:04 +08:00
typof callback === "function"
tangchi695
2020-09-11 15:00:49 +08:00
判断有没有 callback 不就完事儿了吗
momocraft
2020-09-11 15:17:50 +08:00
不管有没有 callback 都返回 promise
如果有 callback 就 then 一份
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
2020-09-11 17:02:21 +08:00
@youmoo 连返回类型都不一样了,最好分开成两个函数

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/706142

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX