方法1 判斷是否有then方法
在Promises/A+規(guī)范有一個叫做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
該方法則可以區(qū)分方法一中的普通帶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