自定义Promise之resolve和reject方法的实现

1. resolve方法的实现

resolve方法为Promise函数对象上的方法,该方法能立即获得一个fulfilled状态的Promise实例

根据传入的参数,分为以下几种情况

  • 参数为非Promise对象,直接返回fulfilled状态的Promise实例,实例结果为传入的参数
  • 参数为Promise对象,返回的Promise实例对象状态和结果取决于传入的Promise实例对象的状态和结果

例如:

  1. 参数为非Promise实例对象时

    let p1 = Promise.resolve(1)
    let p2 = Promise.resolve('success')
    let p3 = Promise.resolve({name: '张三'})
    console.log(p1)  // [[PromiseState]]: "fulfilled" [[PromiseResult]]: 1
    console.log(p2)  // [[PromiseState]]: "fulfilled" [[PromiseResult]]: "success"
    console.log(p3)  // [[PromiseState]]: "fulfilled" [[PromiseResult]]: Object
  2. 参数为Promise实例对象时

    let p1 = Promise.resolve(new Promise((resolve, reject) => {
      resolve(1)
    }))
    let p2 = Promise.resolve(new Promise((resolve, reject) => {
      setTimeout(()=>{
          resolve('success')
      },500)
    }))
    let p3 = Promise.resolve(new Promise((resolve, reject) => {
      reject('失败')
    }))
    console.log(p1) // [[PromiseState]]: "fulfilled" [[PromiseResult]]: 1
    console.log(p2) // [[PromiseState]]: "fulfilled" [[PromiseResult]]: "success"
    console.log(p3) // [[PromiseState]]: "rejected" [[PromiseResult]]: "失败"

1.1 参数为非Promise实例对象实现

/*
  返回一个指定了成功 value 的 promise 对象
  */
Promise.resolve = function (value) {
    // 返回新的Promise实例
    return new Promise((resolve, reject) => {
        // 判断value是否为Promise实例
        if(value instanceof Promise) {

        } else {
            // 直接调用resolve,将当前Promise实例状态改为fulfilled
            resolve(value)
        }
    })
}

1.2 参数为Promise实例对象实现

参数为Promise实例对象时,则需要根据该Promise实例对象的状态去改变要返回的新的Primise状态,通过调用then方法可以实现

/*
  返回一个指定了成功 value 的 promise 对象
  */
Promise.resolve = function (value) {
    // 返回新的Promise实例
    return new Promise((resolve, reject) => {
        // 判断value是否为Promise实例
        if(value instanceof Promise) {
            value.then(resolve, reject)
        } else {
            // 直接调用resolve,将当前Promise实例状态改为fulfilled
            resolve(value)
        }
    })
}

2.reject方法的实现

reject方法为Promise函数对象上的方法,该方法能立即获得一个rejected状态的Promise实例

与resolve方法不同,无论传入的参数是否为Promise实例,reject方法都会返回rejected状态的Promise实例,且结果即为传入的参数

例如:

let p1 = Promise.reject('1')
let p2 = Promise.reject(new Promise((resolve, reject) => {
    resolve(1)
}))
console.log(p1)     // [[PromiseState]]: "rejected" [[PromiseResult]]: "1"
console.log(p2)     // [[PromiseState]]: "rejected"  [[PromiseResult]]: Promise

实现:

/*
  返回一个指定了失败 reason 的 promise 对象
  */
Promise.reject = function (reason) {
    // 返回新的Promise实例
    return new Promise((resolve, reject) => {
        // 直接调用reject,将当前Promise实例状态改为rejected
        reject(reason)
    })
}
暂无评论

发送评论 编辑评论


				
上一篇
下一篇