方法1 判斷是否有then方法
在Promises/A+
規(guī)范有一個(gè)叫做thenable
的概念乡翅,基本上是 "一個(gè)有then方法的對象"。所以你可以這樣來判斷罪郊,但是我們不推薦
function isPromise(obj) {
return (
!!obj &&
(typeof obj === "object" || typeof obj === "function") &&
typeof obj.then === "function"
)
}
但是該方法蠕蚜,在以下案例中,也會被識別成了Promise對象悔橄,盡管他僅僅是一個(gè)普通對象
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
處理過的對象,將會變成一個(gè)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