方法1 判断是否有then方法
在Promises/A+
规范有一个叫做thenable
的概念,基本上是 "一个有then方法的对象"。所以你可以这样来判断,但是我们不推荐
function isPromise(obj) {
return (
!!obj &&
(typeof obj === "object" || typeof obj === "function") &&
typeof obj.then === "function"
)
}
但是该方法,在以下案例中,也会被识别成了Promise对象,尽管他仅仅是一个普通对象
const obj = {
then: function () {
console.log('then')
}
}
isPromise(obj) // true
方法2 判断 Promise.resolve(object) == object
function isPromise(object) {
if (Promise && Promise.resolve) {
return Promise.resolve(object) == object
} else {
throw new Error("Promise not supported in your environment")
}
}
var p = new Promise(function(resolve,reject){
resolve()
});
isPromise(p) // true
该方法则可以区分方法一中的普通带then方法的对象跟真正的promise
对象,使用Promise.resolve
处理过的对象,将会变成一个Promise对象
。如果他等于之前的对象,则能得出resolve
的对象也是Promise对象
方法3 这就是检查对象的原型的字符串是否为"[object Promise]"
function isPromise(p) {
return p && Object.prototype.toString.call(p) === "[object Promise]"
}
var pi = 3.14
var name = "黑猫警长"
var numbers = [1, 2, 3]
var p = new Promise(function (resolve, reject) {
resolve()
})
isPromise(pi) // false
isPromise(name) // false
isPromise(numbers) // false
isPromise(p) // true