无论是 ES6 Promise 还是 bluebird Promise、Q Promise 等。
我如何测试一个给定的对象是否是一个 Promise?
无论是 ES6 Promise 还是 bluebird Promise、Q Promise 等。
我如何测试一个给定的对象是否是一个 Promise?
如果它有一个.then
函数——那是唯一使用的标准Promise库。
Promises/A+ 规范有一个叫做then
能够的概念,它基本上是“一个带有then
方法的对象”。Promise 将并且应该使用 then 方法吸收任何东西。你提到的所有Promise实现都是这样做的。
如果我们看一下规范:
2.3.3.3 if
then
是一个函数,用 x 作为 this 调用它,第一个参数是 resolvePromise,第二个参数是 rejectPromise
它还解释了此设计决策的基本原理:
这种对能力的处理
then
允许 promise 实现互操作,只要它们公开一个 Promises/A+ 兼容的then
方法。它还允许 Promises/A+ 实现用合理的 then 方法“同化”不一致的实现。
你不应该 - 而是调用Promise.resolve(x)
(Q(x)
在 Q 中),它总是将任何值或外部then
能力转换为受信任的Promise。这比自己执行这些检查更安全、更容易。
您始终可以通过测试套件运行它:D
检查是否有一些Promise会不必要地使代码复杂化,只需使用 Promise.resolve
Promise.resolve(valueOrPromiseItDoesntMatter).then(function(value) {
})
免责声明:不是更新 OP 的好答案,仅适用于本机,不适用于跨领域。改为遵循接受的答案。
obj instanceof Promise
应该这样做。请注意,这可能仅适用于原生 es6 Promise。
如果您使用的是 shim、promise 库或任何其他伪装成类似 promise 的东西,那么测试“thenable”(任何带有.then
方法的东西)可能更合适,如此处的其他答案所示。
if (typeof thing?.then === 'function') {
// probably a promise
} else {
// definitely not a promise
}