我正在构建一个库,并且想要创建它,以便消费者可以使用回调或Promise调用我的函数。
做到这一点的最佳方法是什么?
答案 0 :(得分:3)
最好的方法完全取决于用例。
对于软件中的任何事物,“什么是最好的方式”的答案是“取决于”。
话虽这么说,一种典型的方法是分支传递的参数。如果给出了回调,则使用它,否则,返回一个Promise。
这是一个想法(其中潜在的逻辑在返回承诺的doStuff
函数中:
function myModule(cb) {
if (cb) {
doStuff()
.then(result => cb(null, result))
.catch(err => cb(err));
}
return doStuff();
}
我的2美分:
支持这两种方法的唯一真正好处是,如果您需要在没有承诺的情况下支持环境。
否则,这只是多余的复杂性。
现在,您必须在代码中保持两次逻辑。
此外,具有返回类型不一致或以不一致的方式运行的函数(承诺使用微任务,而其他异步机制可能使用常规任务)并不是特别有益。
微妙的不一致不是通常需要的功能。
答案 1 :(得分:1)
您始终可以兑现承诺,而不会破坏任何承诺。检测是否定义了回调,如果已定义,则执行它。
function doubleIt(x, callback) {
return new Promise( (resolve) => {
var ans = x * 2
resolve(ans)
callback && callback(ans)
})
}
doubleIt(4).then(res => console.log(res))
doubleIt(10, res => console.log(res))