Javascript 查找函数是否返回承诺的方法

Javascript 查找函数是否返回承诺的方法,javascript,function,promise,bluebird,Javascript,Function,Promise,Bluebird,下面我有一个函数,它返回一个解析为true的承诺。我有没有办法知道一个函数是否会返回一个承诺 var myPromiseFunction = function(){ return Promise.resolve(true) } myPromiseFunction().then(function(value){ console.log(value) // => true }) function mySyncFunction(){ return "hello" } willR

下面我有一个函数,它返回一个解析为
true
的承诺。我有没有办法知道一个函数是否会返回一个承诺

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
我有没有办法知道一个函数是否会返回一个承诺

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
不(不是在没有实际调用它的情况下)。在这里,您最好依靠命名和API约定的一致性

只是对于无法测试返回类型的一个快速的“证明”,请考虑以下函数:

function maybeAPromise() {
    if (Math.random() < .5) {
        return Promise.resolve('foo');
    } else {
        return 'bar';
    }
}

没有好的方法可以做到这一点,但是您可以调用这些方法并检查它们的返回值

function willReturnPromise(fn) {
    const result = fn();
    return result && typeof result.then === 'function';
}
A+Promise规范不要求promises除了名为
then
的函数外,还需要其他任何东西,因此,如果您希望函数与所有Promise实现一起工作,那么这是最好的选择


调用函数并丢弃结果只是为了确定这不是一个好主意。

在调用后检查返回值。这毕竟是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()
自己动手,将同步代码流折叠到异步代码流中
。然后
会自动为您返回任何内容,因此我发现这种方法非常可读。

解决或
方法
的问题是我不能。所以,一旦它被转换,我就不能在同步庄园中使用它。我认为这是否是一个“问题”是有争议的,但你是对的,这是一个限制。这并不是
Promise
(原生或蓝鸟)API的限制。这是JavaScript从运行到完成语义最深处存在的一个限制。@ThomasReggi这是经典的“函数是什么颜色?”问题:@MattGreer我完全忘记了那篇文章;是的,这是完全相同的问题。在使用承诺时,我通常使用
Promise。resolve
强制我的所有函数具有相同的“颜色”,可能应该将
fn
包装成
try/catch
否?是的,但我认为你根本不应该这样做。只回答问题的字母,然后提及这不是一个好主意。
Promise.resolve(p)=p不起作用。在Chrome、Firefox和Opera中使用
instanceof Promise
@Bergi-Hmm,但我的在Safari中不起作用,所以我会更新到你的。谢谢