我如何判断对象是否是Promise?

无论是ES6 Promise还是蓝鸟Promise,Q Promise等等。

我如何测试以查看给定对象是否为Promise?


承诺库如何决定

如果它有一个.then函数 - 这是唯一的标准许诺库使用。

Promises / A +规范有一个叫做then的概念,它基本上是“一个具有then方法的对象”。 承诺将会并且应该用当时的方法吸收任何东西。 你提到的所有承诺实现都是这样做的。

如果我们看一下规格:

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

它也解释了这个设计决定的基本原理:

的该处理then ABLES允许许实现进行互操作,只要它们暴露承诺/ A +兼容then方法。 它还允许Promises / A +实现通过合理的方法“吸收”不合格的实现。

你应该如何决定

你不应该-改为调用Promise.resolve(x) Q(x)在Q),将永远任何值或外部转换then能够为值得信赖的承诺。 比自己执行这些检查更安全,更简单。

真的需要确定吗?

您可以随时通过测试套件运行它:D


检查是否有必要承诺的东西使代码复杂化,只需使用Promise.resolve

Promise.resolve(valueOrPromiseItDoesntMatter).then(function(value) {

})

这是我的原始答案,此后已被规范批准为测试承诺的方式:

Promise.resolve(obj) == obj

这是有效的,因为算法明确要求Promise.resolve必须返回传入的确切对象,当且仅当它是规范定义的承诺。

我在这里有另一个答案,过去常常这样说,但当时它不适用于Safari,我将其更改为其他内容。 那是一年前,即使在Safari中也可以可靠地工作。

我会编辑我原来的答案,只是觉得不对,因为现在有更多的人投票支持修改后的答案。 我相信这是更好的答案,我希望你同意。

链接地址: http://www.djcxy.com/p/55449.html

上一篇: How do I tell if an object is a Promise?

下一篇: How to get the value of the first promise that succeeds in a chain of promises