找到函数是否会返回promise的方法

时间:2015-07-24 23:00:57

标签: javascript function promise bluebird

下面我有一个函数返回一个解析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

3 个答案:

答案 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会自动为您返回任何内容,因此我觉得这种方法非常易读。