是ES6 Promise
还是蓝鸟Promise
,Q Promise
,如何测试给定对象是否为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运行它>
如果您使用的是Typescript
如果您使用的是异步方法,则可以这样做并避免任何歧义。
c
在寻找一种reliable
ES6:
[检查是否有必要使代码复杂化,只需使用Promise.resolve
这是我最初的答案,此后一直是ratified in the spec作为测试承诺的方法:
更新:
if (typeof thing.then === 'function') {
// probably a promise
} else {
// definitely not a promise
}
要查看给定的对象是否为ES6 Promise
不是完整问题的答案,但我认为值得一提的是,在Node.js 10中添加了一个名为this section的新util函数,用于检查对象是否为本地Promise:
MDN: Function.prototype.toString
包检测承诺的方式:
这里是代码形式isPromise