Promise(简介、基本使用、API、手写实现 Promise、async与await)(五)

简介: Promise(简介、基本使用、API、手写实现 Promise、async与await)(五)

5.4 Promise.catch()实现

5.4.1 catch()实现

// 定义 Promise 的 catch 方法
Promise.prototype.catch = function (onRejected) {
  // catch 方法中执行的是失败的回调函数
  // 与 then 差别为只有失败的回调函数,可以直接使用then
  return this.then( undefined, onRejected )
}
let p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
          reject('Error')
        }, 1000)
      })
      const res1 = p1.catch(reason=>{
        console.log(reason)
      })
      console.log(res1)

5.4.2 异常穿透实现

在then的链式调用的过程中不需要对失败的结果进行处理,主要在最后加一个catch方法处理失败的结果即可。

未实现异常穿透测试:

let p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
          reject('Error')
        }, 1000)
      })
      p1.then((v) => {
        console.log(111)
      })
        .then((v) => {
          console.log(222)
        })
        .catch((r) => {
          console.log(r)
        })

原因:

实现异常穿透:

// 定义 Promise 的 then 方法
Promise.prototype.then = function (onResolved, onRejected) {
  const self = this // 保存调用then的Promise对象
  // 判断失败的回调函数
  // 由于报错造成的原因是失败的回调函数为undefined
  // 所以当失败的回调函数为未定义时候,补充一个失败回调
  // 让其报错
  if (typeof onRejected !== 'function' ) {
    onRejected = reason => {
      throw reason
    }
  }
  ......
}

测试:

let p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
          // reject('Error')
          resolve('OK')
        }, 1000)
      })
      p1.then((v) => {
        console.log(111)
        throw 'ERROR'
      })
        .then((v) => {
          console.log(222)
        })
        .catch((r) => {
          console.log(r)
        })

5.4.3 值传递实现

官方的then()在不指定成功的回调函数也可以继续向下执行

let p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
          // reject('Error')
          resolve('OK')
        }, 1000)
      })
      p1.then()
        .then((v) => {
          console.log(222)
        })
        .then((v) => {
          console.log(333)
        })
        .catch((r) => {
          console.log(r)
        })

实现方法,与异常穿透类似,在没有成功的回调函数的时候一样指定一个成功的回调函数

// 定义 Promise 的 then 方法
Promise.prototype.then = function (onResolved, onRejected) {
  const self = this // 保存调用then的Promise对象
  ......
  // 没有传递成功的回调函数
  // 给一个默认的成功回调函数
  if (typeof onResolved !== 'function') {
    onResolved = value => {
      return value //将resolve中传递的值,即Promise的结果向后传递
    }
  }
  ......
}

测试:

let p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
          // reject('Error')
          resolve('OK')
        }, 1000)
      })
      p1.then()
        .then((v) => {
          console.log(222)
        })
        .then((v) => {
          console.log(333)
        })
        .catch((r) => {
          console.log(r)
        })

5.5 resolve() 实现

// 传递的为Promise对象,则返回的Promise的状态由传入的决定
// 传入的为其他值,则返回的Promise对象为成功
Promise.resolve(value) {
  return new Promise((resolve, reject) => {
    if (value instanceof Promise) {
      // 为Promise对象,肯定可以调用then
      value.then(v => {
        resolve(v)
      }, r => {
        reject(r)
      })
    } else {
      resolve(value)
    }
  })
}

测试:

const p1 = Promise.resolve('OK')
      const p2 = Promise.resolve(
        new Promise((resolve, reject) => {
          resolve('OK~~~')
        })
      )
      const p3 = Promise.resolve(
        new Promise((resolve, reject) => {
          reject('err')
        })
      )
      console.log(p1)
      console.log(p2)
      console.log(p3)

5.6 reject() 实现

无论传递什么值都返回一个失败的Promise对象

Promise.reject = function(value) {
  return new Promise((resolve, reject) => {
    reject(value)
  })
}

测试:

const p1 = Promise.reject('OK')
      const p2 = Promise.reject(
        new Promise((resolve, reject) => {
          resolve('OK~~~')
        })
      )
      const p3 = Promise.reject(
        new Promise((resolve, reject) => {
          reject('err')
        })
      )
      console.log(p1)
      console.log(p2)
      console.log(p3)


相关文章
|
2月前
|
前端开发 JavaScript 开发者
Async 和 Await 是基于 Promise 实现
【10月更文挑战第30天】Async和Await是基于Promise实现的语法糖,它们通过简洁的语法形式,借助Promise的异步处理机制,为JavaScript开发者提供了一种更优雅、更易于理解和维护的异步编程方式。
33 1
|
2月前
|
前端开发
如何使用async/await解决Promise的缺点?
总的来说,`async/await` 是对 Promise 的一种很好的补充和扩展,它为我们提供了更高效、更易读、更易维护的异步编程方式。通过合理地运用 `async/await`,我们可以更好地解决 Promise 的一些缺点,提升异步代码的质量和开发效率。
36 5
|
2月前
|
前端开发 JavaScript
async/await和Promise在性能上有什么区别?
性能优化是一个综合性的工作,除了考虑异步模式的选择外,还需要关注代码的优化、资源的合理利用等方面。
40 4
|
2月前
|
JSON 前端开发 JavaScript
浅谈JavaScript中的Promise、Async和Await
【10月更文挑战第30天】Promise、Async和Await是JavaScript中强大的异步编程工具,它们各自具有独特的优势和适用场景,开发者可以根据具体的项目需求和代码风格选择合适的方式来处理异步操作,从而编写出更加高效、可读和易于维护的JavaScript代码。
35 1
|
3月前
|
前端开发 JavaScript
setTimeout、Promise、Async/Await 的区别
`setTimeout` 是用于延迟执行函数的简单方法;`Promise` 表示异步操作的最终完成或失败;`Async/Await` 是基于 Promise 的语法糖,使异步代码更易读和维护。三者都用于处理异步操作,但使用场景和语法有所不同。
|
3月前
|
前端开发 JavaScript 开发者
JavaScript 中的异步编程:深入了解 Promise 和 async/await
【10月更文挑战第8天】JavaScript 中的异步编程:深入了解 Promise 和 async/await
|
3月前
|
前端开发 JavaScript UED
深入了解JavaScript异步编程:回调、Promise与async/await
【10月更文挑战第11天】深入了解JavaScript异步编程:回调、Promise与async/await
26 0
|
前端开发 JavaScript API
Promise API 简介
Promise API 简介 译者注: 到处是回调函数,代码非常臃肿难看, Promise 主要用来解决这种编程方式, 将某些代码封装于内部。
1012 0
|
20天前
|
人工智能 自然语言处理 API
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动
谷歌推出的Multimodal Live API是一个支持多模态交互、低延迟实时互动的AI接口,能够处理文本、音频和视频输入,提供自然流畅的对话体验,适用于多种应用场景。
67 3
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动
|
7天前
|
JSON 安全 API
淘宝商品详情API接口(item get pro接口概述)
淘宝商品详情API接口旨在帮助开发者获取淘宝商品的详细信息,包括商品标题、描述、价格、库存、销量、评价等。这些信息对于电商企业而言具有极高的价值,可用于商品信息展示、市场分析、价格比较等多种应用场景。