查找函数是否 return promise 的方法

Way to find if function will return promise

下面我有一个函数 return 是一个解析 true 的承诺。有什么方法可以确定一个函数是否 return 一个承诺?

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

Is there any way I can find out if a function will return a promise?

否(并非没有实际调用它)。您最好的办法是依靠命名和 API 约定的一致性。

为了快速 "proof" 无法测试 return 类型,请考虑以下函数:

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

虽然我个人认为像 JavaScript 这样的动态语言的生产力优势值得他们做出权衡,但不可否认的是,缺乏编译时类型安全是 [=24= 中的权衡之一] 类别。

话虽这么说,如果您只想强制结果为 PromisePromise.resolve() 会很方便。例如,

Promise.resolve(maybeAPromise()).then(...);

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

function willReturnPromise(fn) {
    const result = fn();
    return result && typeof result.then === 'function';
}

A+ Promise 规范不要求 promises 具有除名为 then 的函数以外的任何其他内容,因此如果您希望该函数与所有 Promise 实现一起使用,这是您可以做的最好的事情。

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

调用后检查 return 值。毕竟这是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 会自动为您 return 执行任何操作,因此我发现这种方法非常易读。