如何检查对象是否为承诺?

2022-08-29 23:13:45

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

如何测试给定对象是否为 ?Promise


答案 1

承诺库如何决定

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

Promises/A+规范有一个叫做able的概念,它基本上是“一个带有方法的对象”。承诺将而且应该用一种然后的方法同化任何东西。您提到的所有承诺实现都这样做。thenthen

如果我们看一下规范

2.3.3.3 如果 是一个函数,则将其称为 x,如 this,第一个参数 resolvePromise,第二个参数 rejectPromisethen

它还解释了此设计决策的基本原理:

这种对 ables 的处理允许承诺实现进行互操作,只要它们公开了符合 Promises/A+ 的方法。它还允许Promises/A+实现用合理的方法“同化”不合格实现。thenthen

你应该如何决定

你不应该 - 相反,调用(在Q中)将始终将任何值或外部能力转换为可信的承诺。这比自己执行这些检查更安全,更容易。Promise.resolve(x)Q(x)then

真的需要确定吗?

您始终可以通过测试套件运行它:D


答案 2

检查某些东西是否承诺不必要地使代码复杂化,只需使用Promise.resolve

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

})