如何检查对象是否为Promise?

问题描述 投票:315回答:14

是ES6 Promise还是蓝鸟Promise,Q Promise,如何测试给定对象是否为Promise?

javascript promise q bluebird es6-promise
14个回答
322
投票

promise库如何决定

如果具有.then函数-这是only标准的承诺库使用。

Promises / A +规范中有一个称为then able的概念,该概念基本上是“具有then方法的对象”。承诺会并且应该使用then方法吸收anything。您提到的所有promise实现都可以做到这一点。

如果我们看specification

2.3.3.3如果then是一个函数,则用x来调用它,第一个参数resolvePromise,第二个参数rejectPromise

它也解释了此设计决策的原理:

then ables的这种处理允许promise实现能够互操作,只要它们公开了符合Promises / A +的then方法。它还允许Promises / A +实现使用合理的then方法“整合”不合格的实现。

您应该如何决定

您不应该-而是呼叫Promise.resolve(x)(Q中的Q(x)),这会总是将任何值或外部then转换为可信任的承诺。比您自己执行这些检查更安全,更轻松。

真的需要确定吗?

您始终可以通过the test suite:D运行它>


6
投票

如果您使用的是Typescript


6
投票

如果您使用的是异步方法,则可以这样做并避免任何歧义。


3
投票
c

-1
投票

在寻找一种reliable


-3
投票

ES6:


161
投票

[检查是否有必要使代码复杂化,只需使用Promise.resolve


95
投票

这是我最初的答案,此后一直是ratified in the spec作为测试承诺的方法:


56
投票

更新:


44
投票
if (typeof thing.then === 'function') {
    // probably a promise
} else {
    // definitely not a promise
}

15
投票

要查看给定的对象是否为ES6 Promise


11
投票

不是完整问题的答案,但我认为值得一提的是,在Node.js 10中添加了一个名为this section的新util函数,用于检查对象是否为本地Promise:


9
投票

MDN: Function.prototype.toString包检测承诺的方式:


6
投票

这里是代码形式isPromise

© www.soinside.com 2019 - 2024. All rights reserved.