下面我有一个函数返回一个解析true
的promise。有什么方法可以找出一个函数是否会返回一个承诺?
var myPromiseFunction = function(){
return Promise.resolve(true)
}
myPromiseFunction().then(function(value){
console.log(value) // => true
})
function mySyncFunction(){
return "hello"
}
willReturnPromise(myPromiseFunction) // => true
willReturnPromise(mySyncFunction) // => false
答案 0 :(得分:2)
有什么办法可以判断函数是否会返回一个承诺?
否(不是没有实际调用它)。您最好的办法是依靠命名和API约定的一致性。
只是为了快速“证明”无法测试返回类型,请考虑以下函数:
function maybeAPromise() {
if (Math.random() < .5) {
return Promise.resolve('foo');
} else {
return 'bar';
}
}
虽然我个人认为像JavaScript这样的动态语言的生产力优势值得他们权衡,但不可否认的是,缺乏编译时类型安全性是“负面”类别中的权衡之一。
话虽如此,Promise.resolve()
如果您只是想强制结果为Promise
,则会很方便。例如,
Promise.resolve(maybeAPromise()).then(...);
答案 1 :(得分:1)
没有好办法,但你可以调用方法并检查它们的返回值。
function willReturnPromise(fn) {
const result = fn();
return result && typeof result.then === 'function';
}
A + Promise规范不要求promises除了名为then
的函数之外还有其他任何东西,所以如果你想让函数与所有Promise实现一起使用,这是你能做的最好的事情。
调用函数并丢弃结果只是为了确定这个并不是一个好主意。
答案 2 :(得分:0)
调用后检查返回值。毕竟这是JavaScript,而不是一些静态类型的语言。你有完全相同的选择:
function foo(func) {
var result = func();
if (result instanceof Promise) {
result.then(bar).catch(failure);
} else {
bar(result);
}
}
foo(myPromiseFunction);
foo(mySyncFunction);
但我建议不要进行此类优化,因为它会增加复杂性。最好让Promise.resolve()
做它的事情并将同步代码流折叠到异步代码流中。 .then
会自动为您返回任何内容,因此我觉得这种方法非常易读。