当前位置: 代码迷 >> 综合 >> 手写Promise 封装Promise resolve reject then catch Promise.resolve Promise.reject
  详细解决方案

手写Promise 封装Promise resolve reject then catch Promise.resolve Promise.reject

热度:72   发布时间:2023-11-29 19:17:19.0

Promsie 代码

(function (window) { //首先写一个自调用函数const PENDING = 'pending'const onREJECT = 'onReject'const onRESOLVE = 'onResolve'function Promise(executor) {this.status = PENDING // 存状态this.data = undefined // 存储结果值this.callbacks = [] // 存储回调函数const _this = this // 这个this 指向Promise function resolve(value) { // 可以用箭头函数if (_this.status != PENDING) {// 状态只能有一次 不是pending直接结束return}_this.status = onRESOLVE //状态_this.data = value // 传过来的 valueif (_this.callbacks.length > 0) { // 有函数就执行setTimeout(() => {_this.callbacks.forEach(element => {element.resolve(value)});})}}function reject(reason) {if (_this.status != PENDING) {// 状态只能有一次 不是pending直接结束return}_this.status = onREJECT //状态_this.data = reason // 传过来的 valueif (_this.callbacks.length > 0) { // 有函数就执行setTimeout(() => {_this.callbacks.forEach(element => {element.reject(reason)});})}}try {executor(resolve, reject)} catch (error) { // 如果promise 有异常就变成rejectreject(error)}} // promise 的 resolve 和 reject Promise.prototype.then = function (resolve, reject) {resolve = typeof resolve === 'function' ? resolve : value => value //向后传成功的valuereject = typeof reject === 'function' ? reject : reason => {throw reason} // 指定默认的失败回调(实现错误/异常传透关键点) const self = thisreturn new Promise((resolves, rejects) => {function handle(callBack) {// 1、如果抛出异常,return 的promise 就会失败 ,reason 就是 error// 2、如果回调函数返回的不是promise,return 的promise 就会成功,value 就是返回的值// 3、如果回调函数返回的是promise return 的promise 结果就是这个promise 的结果try {const result = callBack(self.data)// 捕获错误if (result instanceof Promise) {result.then(value => {resolves(value) // 当result 成功的时候 让return 的promise 也成功},reason => {rejects(reason) // 当result 失败的时候 让return 的promise 也失败})// result.then(value, reason) // 简写} else {// 若果回调函数返回的不是promise,return 的promise 就会成功,value 就是返回的值resolves(result)}} catch (error) {rejects(error)// 传入错误}}// 返回一个新的promise 对象if (this.status == PENDING) {// 假设当前pending时候将回调存起来this.callbacks.push({resolve() {handle(resolve)},reject() {handle(reject)}})} else if (this.status == onRESOLVE) { // 若果当前是onRESOLVE状态 , 异步执行onRESOLVE  并改变return 的promise 状态setTimeout(() => {handle(resolve)})} else { // onRejectsetTimeout(() => { // 若果当前是onRESOLVE状态 异步执行onRESOLVE,并改变return 的promise 状态handle(reject)})}})}Promise.prototype.catch = function (reject) {return this.then(undefined, reject)}Promise.reject = function (reason) {return new Promise((resolve, reject) => {reject(reason)})}Promise.resolve = function (value) {return new Promise((resolve, reject) => {if (value instanceof Promise) {value.then(resolve, reject)} else {resolve(value)}})}Promise.all = function (promise) {}Promise.race = function (promise) {}window.Promise = Promise // 让全局的Promise = Promise 这里很重要
})(window)

 测试代码

?
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>封装promise 测试用的</title>
</head><body></body>
<script src="../promise/promise.js"></script>
<script>// const p = new Promise((resolve, reject) => {//     setTimeout(() => {//         // resolve(1)//         reject(2)//     });// }).then(//     value => {//         console.log(value);//     },//     reason => {//         console.log(reason)//         // return new Promise((resolve, reject) => {//         //     reject(55)//         // })//         throw 55//     }// ).then(//     value => {//         console.log(value);//     },//     reason => {//         console.log(reason);//         throw 5//     }// ).catch((reason) => {//     console.log(reason);//     // return new Promise(() => { }) // 组知下面代码执行链式调用 终止promise链// }).then(//     value => {//         console.log(value);//     },//     reason => {//         console.log(reason);//     }// )// let p = Promise.reject(1)let p = Promise.reject(1)p.then(value => {console.log(value);}, reason => {console.log(reason);})
</script></html>?

  相关解决方案