判断对象是否为Promise对象

方法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

你可能感兴趣的:(判断对象是否为Promise对象)