Pormise部分面试题

Promise是什么?

        Promise是ES6新增的语法,是一种异步编程的一种解决方案,Promise本质上是一个绑定了回调的对象。 Promise在一定程度上解决了回调函数的书写结构问题,解决了回调地狱的问题。Promise可以看作是一个状态机,它有三种状态:pending,fulfilled,rejected,其中初始状态是pending,可以通过函数resolve(表示成功)把状态变为fulfilled,或者通过函数reject(表示失败)把状态变为rejected。状态一经改变就不能再次变化,及状态发生凝固Promise 的状态变化只能发生一次。

Promise的状态可变吗?

        不可变

Promise.resolve()

        将现有对象转为Promise对象,状态为fullfilled

Promise.reject()

        将现有对象转为Promise对象,状态为rejected

prmoise.all()

        核心:等待所有结果完成,都成功走then方法,有一个失败就走catch方法                

        该方法接收一个可迭代对象(如Array,Map,Set),返回一个Promise(新期约),只有当该数组中所有的Promise完成后才会有pending转变为resolved执行then里面的回调函数;若数组中有任意一个promise被拒绝则会执行失败回调,即catch方法会捕获到首个被执行的reject函数。通过该方法获得的成功结果的数组里面的数据顺序和接收到的promise数组顺序是一致的。

Promise.allSelected()

        核心:发起多个请求(不管成功失败),等到所有请求后再做下一步处理,都走then方法拿到成功或者失败的结果

        返回一个在所有给定的promise都已经fulfilled或rejected后的promise,都走then方法拿到成功或者失败的结果,并带有一个对象数组,每个对象表示对应的promise结果

Promise.race()

        核心: 同时发起几个异步请求,谁先有结果就拿谁的

        应用:检测请求超时

        Promise.race()和Promise.all()一样都是将多个Promise实例组合成一个Promise的静态方法 不同的是:Promise.race()当传入的数组中有任意一个promise被拒绝或者成功,不管成功或者失败,都会采用第一个promise作为返回值,若成功则执行then,失败执行catch。

Promise.any()

        核心:同时发起多个请求,有一个成功就走then拿到成功结果,全部失败就走catch 类似筛选成功结果

        区别于Promise.all(), Promise.any() 只要有一个成功就执行then方法拿到成功的结果,如果没有一个成功,就走catch方法返回一个所有子项组成的失败的promise的组合

Promise.any() 和 Promise.race() 的区别

        Promise.race()的 promise 在你给它的第一个 promise 被拒绝时被拒绝any的 promise 不是,因为可能会实现另一个 promise 。

        Promise.any()的 promise 的拒绝原因是 AggregateError(多个promise共同错误的集合) , 但是 race的拒绝原因将是第一个被拒绝的 promise 的拒绝原因。

Prmoise.all()和Promise.allSelected()区别

        Prmoise.all()在接受失败状态时会走.catch方法, Promise.allSelected()则走.then方法

手撕Promise的then和catch

function PromiseZ(executor) {
  this.status = 'pending'
  this.result = undefined
  this.cb = []
  const resolve = (res) => {
    if (this.status !== 'pending') return
    this.result = res
    this.status = 'fulfilled'
    this.cb.forEach((item) => {
      item.success && item.success(res)
    })
  }
  const reject = (res) => {
    if (this.status !== 'pending') return
    this.result = res
    this.status = 'rejected'
    this.cb.forEach((item) => {
      item.fail && item.fail(res)
    })
  }

  executor(resolve, reject)
}

PromiseZ.prototype.then = function (successCB, failCB) {
  if(!successCB) successCB = res => res
   // 错误参数转接头
  if(!failCB) failCB = res => res
  return new PromiseZ((resolve, reject) => {
      //同步处理
    if (this.status === 'fulfilled') {
      const result = successCB && successCB(this.result)
      if (result instanceof PromiseZ) {
        result.then(
          (res) => {
            resolve(res)
          },
          (err) => {
            reject(err)
          }
        )
      } else {
        resolve(result)
      }
    }
    if (this.status === 'rejected') {
      const result = failCB && failCB(this.result)
      if (result instanceof PromiseZ) {
        result.then(
          (res) => {
            resolve(res)
          },
          (err) => {
            reject(err)
          }
        )
      } else {
        reject(result)
      }
    }
    if (this.status === 'pending') {
      // 异步处理
      this.cb.push({
        success: () => {
          const result = successCB(this.result)
          if (result instanceof PromiseZ) {
            result.then(
              (res) => {
                resolve(res)
              },
              (err) => {
                reject(err)
              }
            )
          } else {
            resolve(result)
          }
        },
        fail: () => {
          const result = failCB(this.result)
          if (result instanceof PromiseZ) {
            result.then(
              (res) => {
                resolve(res)
              },
              (err) => {
                reject(err)
              }
            )
          } else {
            reject(result)
          }
        },
      })
    }
  })
}

PromiseZ.prototype.catch = function(failCB){
  this.then(undefined, failCB)
}

自己根据网上教程总结的,比较粗糙,大佬们有错误可以指出

  • 44
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值