Promise自定义
发布日期:2021-05-04 20:48:08 浏览次数:29 分类:原创文章

本文共 55156 字,大约阅读时间需要 183 分钟。

1.初始化结构搭建

1.1 结构:

在这里插入图片描述

1.2 代码:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>           </style></head><body>    <script src="a.js"></script>    <script>     let p = new Promise((resolve,reject) => {                resolve('ok')     })    p.then(value => {             console.log(value);             },reason => {            console.log(reason);            })         </script></body></html>
// 自定义promise// 声明构造函数function Promise(executor){       }//添加 then 方法Promise.prototype.then = function (onResolved,onRejected){   }

2.resolve和reject实现

2.1 代码:

在这里插入代码片<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>           </style></head><body>    <script src="a.js"></script>    <script>     let p = new Promise((resolve,reject) => {                resolve('ok')            // reject('error')     })     console.log(p);         // p.then(value => {        //      console.log(value);             // },reason => {        //     console.log(reason);            // })         </script></body></html>
// 自定义promise// 声明构造函数function Promise(executor){       // 添加Promise的属性    this.PromiseState = 'pending'    this.PromiseResult = null    // 保存实例对象的this的值    const that = this    // 定义resolve函数    function resolve(data){           // 改变Promise对象状态        that.PromiseState = 'fulfilled'        // 改变Promise对象结果        that.PromiseResult = data    }    // 定义reject函数    function reject(data){           // 改变Promise对象状态        that.PromiseState = 'rejected'        // 改变Promise对象结果        that.PromiseResult = data    }    // 执行executor函数    executor(resolve,reject)}//添加 then 方法Promise.prototype.then = function (onResolved,onRejected){   }

3.throw抛出异常改变状态

3.1 代码:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>           </style></head><body>    <script src="a.js"></script>    <script>     let p = new Promise((resolve,reject) => {                // resolve('ok')            // reject('error')            throw '出错了--error'     })     console.log(p);         // p.then(value => {        //      console.log(value);             // },reason => {        //     console.log(reason);            // })         </script></body></html>
// 自定义promise// 声明构造函数function Promise(executor){       // 添加Promise的属性    this.PromiseState = 'pending'    this.PromiseResult = null    // 保存实例对象的this的值    const that = this    // 定义resolve函数    function resolve(data){           // 改变Promise对象状态        that.PromiseState = 'fulfilled'        // 改变Promise对象结果        that.PromiseResult = data    }    // 定义reject函数    function reject(data){           // 改变Promise对象状态        that.PromiseState = 'rejected'        // 改变Promise对象结果        that.PromiseResult = data    }    try {           // 执行executor函数        executor(resolve,reject)    } catch (error) {           reject(error)        console.log(error);    }}//添加 then 方法Promise.prototype.then = function (onResolved,onRejected){   }

4.Promise状态只能修改一次

4.1 代码:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>           </style></head><body>    <script src="a.js"></script>    <script>     let p = new Promise((resolve,reject) => {                resolve('ok')            reject('error')     })     console.log(p);         // p.then(value => {        //      console.log(value);             // },reason => {        //     console.log(reason);            // })         </script></body></html>
// 自定义promise// 声明构造函数function Promise(executor){       // 添加Promise的属性    this.PromiseState = 'pending'    this.PromiseResult = null    // 保存实例对象的this的值    const that = this    // 定义resolve函数    function resolve(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'fulfilled'        // 改变Promise对象结果        that.PromiseResult = data    }    // 定义reject函数    function reject(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'rejected'        // 改变Promise对象结果        that.PromiseResult = data    }    try {           // 执行executor函数        executor(resolve,reject)    } catch (error) {           reject(error)        console.log(error);    }}//添加 then 方法Promise.prototype.then = function (onResolved,onRejected){   }

5.then方法执行回调函数

5.1 代码:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>           </style></head><body>    <script src="a.js"></script>    <script>     let p = new Promise((resolve,reject) => {                resolve('ok')            reject('error')     })     console.log(p);    p.then(value => {             console.log(value);             },reason => {            console.log(reason);            })         </script></body></html>
// 自定义promise// 声明构造函数function Promise(executor){       // 添加Promise的属性    this.PromiseState = 'pending'    this.PromiseResult = null    // 保存实例对象的this的值    const that = this    // 定义resolve函数    function resolve(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'fulfilled'        // 改变Promise对象结果        that.PromiseResult = data    }    // 定义reject函数    function reject(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'rejected'        // 改变Promise对象结果        that.PromiseResult = data    }    try {           // 执行executor函数        executor(resolve,reject)    } catch (error) {           reject(error)        console.log(error);    }}//添加 then 方法Promise.prototype.then = function (onResolved,onRejected){       //执行成功回调函数    if(this.PromiseState === 'fulfilled') onResolved(this.PromiseResult)    //执行失败回调函数    if(this.PromiseState === 'rejected') onRejected(this.PromiseResult)}

6.异步任务回调函数的执行

6.1 执行器中执行异步代码:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>           </style></head><body>    <script src="a.js"></script>    <script>     let p = new Promise((resolve,reject) => {            setTimeout(function(){                resolve('ok')        },1000)     })     console.log(p);    p.then(value => {             console.log(value);             },reason => {            console.log(reason);            })    </script></body></html>
// 自定义promise// 声明构造函数function Promise(executor){       // 添加Promise的属性    this.PromiseState = 'pending'    this.PromiseResult = null    // 保存实例对象的this的值    const that = this    // 定义resolve函数    function resolve(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'fulfilled'        // 改变Promise对象结果        that.PromiseResult = data    }    // 定义reject函数    function reject(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'rejected'        // 改变Promise对象结果        that.PromiseResult = data    }    try {           // 执行executor函数        executor(resolve,reject)    } catch (error) {           reject(error)        console.log(error);    }}//添加 then 方法Promise.prototype.then = function (onResolved,onRejected){       //执行成功回调函数    if(this.PromiseState === 'fulfilled') onResolved(this.PromiseResult)    //执行失败回调函数    if(this.PromiseState === 'rejected') onRejected(this.PromiseResult)}

在这里插入图片描述

6.2 原因:(为什么后台没有打印这结果) console.log(value);

异步调用,代码往下执行到p.then()方法位置,因为先指定回调函数,此时状态是pending,p.then()方法不执行,定时器开始执行,再改变状态后,p.then()方法的位置已经执行过了,所以没有输出结果

6.2 解决:

根据原因,在改变状态的时候调用回调函数。
在这里插入图片描述

在这里插入图片描述

6.3 代码:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>           </style></head><body>    <script src="a.js"></script>    <script>     let p = new Promise((resolve,reject) => {            setTimeout(function(){                resolve('ok')                   },1000)        // reject('error')     })     console.log(p);    p.then(value => {             console.log(value);    },reason => {            console.log(reason);            })    </script></body></html>
// 自定义promise// 声明构造函数function Promise(executor){       // 添加Promise的属性    this.PromiseState = 'pending'    this.PromiseResult = null    // 保存实例对象的this的值    const that = this    // 保存then方法的回调函数    this.callback = {   }    // 定义resolve函数    function resolve(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'fulfilled'        // 改变Promise对象结果        that.PromiseResult = data        if(that.callback) that.callback.onResolved(data)    }    // 定义reject函数    function reject(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'rejected'        // 改变Promise对象结果        that.PromiseResult = data        if(that.callback) that.callback.onRejected(data)    }    try {           // 执行executor函数        executor(resolve,reject)    } catch (error) {           reject(error)        console.log(error);    }}//添加 then 方法Promise.prototype.then = function (onResolved,onRejected){       //执行成功回调函数    if(this.PromiseState === 'fulfilled') onResolved(this.PromiseResult)    //执行失败回调函数    if(this.PromiseState === 'rejected') onRejected(this.PromiseResult) // 保存回调函数    if(this.PromiseState === 'pending') {           this.callbacks = {               onResolved,            onRejected        }    }}

7.指定多个回调函数的实现

7.1 初始:添加多个回调

在这里插入图片描述

7.2 最后一个回调才会执行

在这里插入图片描述
alet(value) 没有输出

7.3 解决:

  1. 改变callback为callbacks数组,保存每次回调函数的结果
 // 保存then方法的回调函数    this.callbacks = []
  1. resolve()/rejecte()里遍历callbacks数组
 // 变成数组来保存        that.callbacks.forEach(item => {               item.onResolved(data)        })
that.callbacks.forEach(item => {               item.onRejected(data)        })
  1. then方法中修改保存回调函数
// 保存回调函数    if(this.PromiseState === 'pending') {           this.callbacks.push({               onResolved,            onRejected        })    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.4 代码:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>           </style></head><body>    <script src="a.js"></script>    <script>     let p = new Promise((resolve,reject) => {            setTimeout(function(){                resolve('ok')                   },1000)        // reject('error')     })     console.log(p);    p.then(value => {             alert(value)    },reason => {            alert(value)    })    p.then(value => {             console.log(value);    },reason => {            console.log(reason);    })    </script></body></html>
// 自定义promise// 声明构造函数function Promise(executor){       // 添加Promise的属性    this.PromiseState = 'pending'    this.PromiseResult = null    // 保存实例对象的this的值    const that = this    // 保存then方法的回调函数    this.callbacks = []    // 定义resolve函数    function resolve(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'fulfilled'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onResolved(data)        // 变成数组来保存        that.callbacks.forEach(item => {               item.onResolved(data)        })    }    // 定义reject函数    function reject(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'rejected'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onRejected(data)        that.callbacks.forEach(item => {               item.onRejected(data)        })    }    try {           // 执行executor函数        executor(resolve,reject)    } catch (error) {           reject(error)        console.log(error);    }}//添加 then 方法Promise.prototype.then = function (onResolved,onRejected){       //执行成功回调函数    if(this.PromiseState === 'fulfilled') onResolved(this.PromiseResult)    //执行失败回调函数    if(this.PromiseState === 'rejected') onRejected(this.PromiseResult)    // 保存回调函数    if(this.PromiseState === 'pending') {           this.callbacks.push({               onResolved,            onRejected        })    }}

8.同步修改状态then方法结果返回

8.1 代码:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>           </style></head><body>    <script src="a.js"></script>    <script>     let p = new Promise((resolve,reject) => {            // setTimeout(function(){            //     resolve('ok')                   // },1000)        resolve('error')     })    let result = p.then(value => {             console.log(value);        //  return new Promise((resolve,reject) => {            //      resolve('pl')        //  })        throw 'errpr'    },reason => {            console.log(reason);    })    console.log(result);        </script></body></html>
// 自定义promise// 声明构造函数function Promise(executor){       // 添加Promise的属性    this.PromiseState = 'pending'    this.PromiseResult = null    // 保存实例对象的this的值    const that = this    // 保存then方法的回调函数    this.callbacks = []    // 定义resolve函数    function resolve(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'fulfilled'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onResolved(data)        // 变成数组来保存        that.callbacks.forEach(item => {               item.onResolved(data)        })    }    // 定义reject函数    function reject(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'rejected'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onRejected(data)        that.callbacks.forEach(item => {               item.onRejected(data)        })    }    try {           // 执行executor函数        executor(resolve,reject)    } catch (error) {           reject(error)        console.log(error);    }}//添加 then 方法Promise.prototype.then = function (onResolved,onRejected){       return new Promise((resolve,reject) => {           //执行成功回调函数        if(this.PromiseState === 'fulfilled'){               try {                   let rs = onResolved(this.PromiseResult)            // 判断            if(rs instanceof Promise) {                   //是Promise对象                rs.then(v => {                       resolve(v)                },r => {                       reject(r)                })            }else{                   // 不是Promise对象 成功状态                resolve(rs)            }            } catch (error) {                   reject(error)            }        }        //执行失败回调函数        if(this.PromiseState === 'rejected') onRejected(this.PromiseResult)        // 保存回调函数        if(this.PromiseState === 'pending') {               this.callbacks.push({                   onResolved,                onRejected            })        }    })    }

8.同步修改状态then方法结果返回

8.1 代码:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>           </style></head><body>    <script src="a.js"></script>    <script>     let p = new Promise((resolve,reject) => {            setTimeout(function(){                reject('ok')        },1000)        // resolve('error')     })    let result = p.then(value => {             console.log(value);         throw '123'    },reason => {            console.log(reason);    })    console.log(result);        </script></body></html>
// 自定义promise// 声明构造函数function Promise(executor){       // 添加Promise的属性    this.PromiseState = 'pending'    this.PromiseResult = null    // 保存实例对象的this的值    const that = this    // 保存then方法的回调函数    this.callbacks = []    // 定义resolve函数    function resolve(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'fulfilled'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onResolved(data)        // 变成数组来保存        that.callbacks.forEach(item => {               item.onResolved()        })    }    // 定义reject函数    function reject(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'rejected'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onRejected(data)        that.callbacks.forEach(item => {               item.onRejected()        })    }    try {           // 执行executor函数        executor(resolve,reject)    } catch (error) {           reject(error)    }}//添加 then 方法Promise.prototype.then = function (onResolved,onRejected){      const self = this    return new Promise((resolve,reject) => {           //执行成功回调函数        if(this.PromiseState === 'fulfilled'){               try {                   let rs = onResolved(this.PromiseResult)            // 判断            if(rs instanceof Promise) {                   //是Promise对象                rs.then(v => {                       resolve(v)                },r => {                       reject(r)                })            }else{                   // 不是Promise对象 成功状态                resolve(rs)            }            } catch (error) {                   reject(error)            }        }        //执行失败回调函数        if(this.PromiseState === 'rejected') onRejected(this.PromiseResult)        // 保存回调函数        if(this.PromiseState === 'pending') {               this.callbacks.push({                   onResolved:function(){                       try {                           let rs = onResolved(self.PromiseResult)                    // 判断                    if(rs instanceof Promise) {                           //是Promise对象                        rs.then(v => {                               resolve(v)                        },r => {                               reject(r)                        })                    }else{                           // 不是Promise对象 成功状态                        resolve(rs)                    }                    } catch (error) {                           reject(error)                    }                },                onRejected:function(){                       try {                           let rs = onRejected(self.PromiseResult)                    // 判断                    if(rs instanceof Promise) {                           //是Promise对象                        rs.then(v => {                               resolve(v)                        },r => {                               reject(r)                        })                    }else{                           // 不是Promise对象 成功状态                        resolve(rs)                    }                    } catch (error) {                           reject(error)                    }                },            })        }    })    }

9.then方法的完善和优化

9.1 代码:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>           </style></head><body>    <script src="a.js"></script>    <script>     let p = new Promise((resolve,reject) => {            setTimeout(function(){                resolve('ok')        },1000)        // resolve('123')     })    let result = p.then(value => {             console.log(value);         return '123'    },reason => {            console.log(reason);    })    console.log(result);        </script></body></html>
// 自定义promise// 声明构造函数function Promise(executor){       // 添加Promise的属性    this.PromiseState = 'pending'    this.PromiseResult = null    // 保存实例对象的this的值    const that = this    // 保存then方法的回调函数    this.callbacks = []    // 定义resolve函数    function resolve(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'fulfilled'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onResolved(data)        // 变成数组来保存        that.callbacks.forEach(item => {               item.onResolved()        })    }    // 定义reject函数    function reject(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'rejected'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onRejected(data)        that.callbacks.forEach(item => {               item.onRejected()        })    }    try {           // 执行executor函数        executor(resolve,reject)    } catch (error) {           reject(error)    }}//添加 then 方法Promise.prototype.then = function (onResolved,onRejected){      const self = this    return new Promise((resolve,reject) => {           function changeState(type){               try {                   let rs = type(self.PromiseResult)            // 判断            if(rs instanceof Promise) {                   //是Promise对象                rs.then(v => {                       resolve(v)                },r => {                       reject(r)                })            }else{                   // 不是Promise对象 成功状态                resolve(rs)            }            } catch (error) {                   reject(error)            }        }        //执行成功回调函数        if(this.PromiseState === 'fulfilled') changeState(onResolved)        //执行失败回调函数        if(this.PromiseState === 'rejected') changeState(onRejected)        // 保存回调函数        if(this.PromiseState === 'pending') {               this.callbacks.push({                   onResolved:function(){                       changeState(onResolved)                },                onRejected:function(){                       changeState(onRejected)                }            })        }    })    }

10.catch方法异常穿透及值传递

10.1 异常穿透代码:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>           </style></head><body>    <script src="a.js"></script>    <script>     let p = new Promise((resolve,reject) => {            setTimeout(function(){                reject('error')        },1000)        // reject('123')        // throw '123'     })     p.then(value => {             console.log(111);     })     .then(value => {             console.log(222);     })    .catch(reason => {            console.log(reason);    })    </script></body></html>
// 自定义promise// 声明构造函数function Promise(executor){       // 添加Promise的属性    this.PromiseState = 'pending'    this.PromiseResult = null    // 保存实例对象的this的值    const that = this    // 保存then方法的回调函数    this.callbacks = []    // 保存catch方法的回调函数    this.catchCallbacks = []    // 定义resolve函数    function resolve(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'fulfilled'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onResolved(data)        // 变成数组来保存        that.callbacks.forEach(item => {               item.onResolved()        })    }    // 定义reject函数    function reject(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'rejected'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onRejected(data)        that.callbacks.forEach(item => {               item.onRejected()        })        that.catchCallbacks.forEach(item => {               item.onRejected()        })    }    try {           // 执行executor函数        executor(resolve,reject)    } catch (error) {           reject(error)    }}//添加 then() 方法Promise.prototype.then = function (onResolved,onRejected){      const self = this   // 异常穿透   if(typeof onRejected !== 'function') {          onRejected = reason => {              throw reason       }   }   // 值传递  p.then()......   if(typeof onResolved !== 'function') {           onResolved = value => value    }    return new Promise((resolve,reject) => {           function changeState(type){               try {                   let rs = type(self.PromiseResult)            // 判断            if(rs instanceof Promise) {                   //是Promise对象                rs.then(v => {                       resolve(v)                },r => {                       reject(r)                })            }else{                   // 不是Promise对象 成功状态                resolve(rs)            }            } catch (error) {                   reject(error)            }        }        //执行成功回调函数        if(this.PromiseState === 'fulfilled') changeState(onResolved)        //执行失败回调函数        if(this.PromiseState === 'rejected') changeState(onRejected)        // 保存回调函数        if(this.PromiseState === 'pending') {               this.callbacks.push({                   onResolved:function(){                       changeState(onResolved)                },                onRejected:function(){                       changeState(onRejected)                }            })        }    })    }// 添加catch()方法Promise.prototype.catch = function(onRejected){       return this.then(undefined,onRejected)}

10.2 值传递代码:

在这里插入代码片<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>           </style></head><body>    <script src="a.js"></script>    <script>     let p = new Promise((resolve,reject) => {            setTimeout(function(){                resolve('error')        },1000)        // reject('123')        // throw '123'     })     p.then()     .then(value => {           console.log(111);     })     .then(value => {             console.log(222);     })    .catch(reason => {            console.log(reason);    })    </script></body></html>
// 自定义promise// 声明构造函数function Promise(executor){       // 添加Promise的属性    this.PromiseState = 'pending'    this.PromiseResult = null    // 保存实例对象的this的值    const that = this    // 保存then方法的回调函数    this.callbacks = []    // 保存catch方法的回调函数    this.catchCallbacks = []    // 定义resolve函数    function resolve(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'fulfilled'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onResolved(data)        // 变成数组来保存        that.callbacks.forEach(item => {               item.onResolved()        })    }    // 定义reject函数    function reject(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'rejected'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onRejected(data)        that.callbacks.forEach(item => {               item.onRejected()        })        that.catchCallbacks.forEach(item => {               item.onRejected()        })    }    try {           // 执行executor函数        executor(resolve,reject)    } catch (error) {           reject(error)    }}//添加 then() 方法Promise.prototype.then = function (onResolved,onRejected){      const self = this   // 异常穿透   if(typeof onRejected !== 'function') {          onRejected = reason => {              throw reason       }   }   // 值传递  p.then()......   if(typeof onResolved !== 'function') {           onResolved = value => value    }    return new Promise((resolve,reject) => {           function changeState(type){               try {                   let rs = type(self.PromiseResult)            // 判断            if(rs instanceof Promise) {                   //是Promise对象                rs.then(v => {                       resolve(v)                },r => {                       reject(r)                })            }else{                   // 不是Promise对象 成功状态                resolve(rs)            }            } catch (error) {                   reject(error)            }        }        //执行成功回调函数        if(this.PromiseState === 'fulfilled') changeState(onResolved)        //执行失败回调函数        if(this.PromiseState === 'rejected') changeState(onRejected)        // 保存回调函数        if(this.PromiseState === 'pending') {               this.callbacks.push({                   onResolved:function(){                       changeState(onResolved)                },                onRejected:function(){                       changeState(onRejected)                }            })        }    })    }// 添加catch()方法Promise.prototype.catch = function(onRejected){       return this.then(undefined,onRejected)}

11.Promise.resolve()的封装

11.1 代码:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>           </style></head><body>    <script src="a.js"></script>    <script>    const p = Promise.resolve(Promise.resolve('ok'));    console.log(p);        </script></body></html>
// 自定义promise// 声明构造函数function Promise(executor){       // 添加Promise的属性    this.PromiseState = 'pending'    this.PromiseResult = null    // 保存实例对象的this的值    const that = this    // 保存then方法的回调函数    this.callbacks = []    // 保存catch方法的回调函数    this.catchCallbacks = []    // 定义resolve函数    function resolve(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'fulfilled'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onResolved(data)        // 变成数组来保存        that.callbacks.forEach(item => {               item.onResolved()        })    }    // 定义reject函数    function reject(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'rejected'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onRejected(data)        that.callbacks.forEach(item => {               item.onRejected()        })        that.catchCallbacks.forEach(item => {               item.onRejected()        })    }    try {           // 执行executor函数        executor(resolve,reject)    } catch (error) {           reject(error)    }}//添加 then() 方法Promise.prototype.then = function (onResolved,onRejected){      const self = this   // 异常穿透   if(typeof onRejected !== 'function') {          onRejected = reason => {              throw reason       }   }   // 值传递  p.then()......   if(typeof onResolved !== 'function') {           onResolved = value => value    }    return new Promise((resolve,reject) => {           function changeState(type){               try {                   let rs = type(self.PromiseResult)            // 判断            if(rs instanceof Promise) {                   //是Promise对象                rs.then(v => {                       resolve(v)                },r => {                       reject(r)                })            }else{                   // 不是Promise对象 成功状态                resolve(rs)            }            } catch (error) {                   reject(error)            }        }        //执行成功回调函数        if(this.PromiseState === 'fulfilled') changeState(onResolved)        //执行失败回调函数        if(this.PromiseState === 'rejected') changeState(onRejected)        // 保存回调函数        if(this.PromiseState === 'pending') {               this.callbacks.push({                   onResolved:function(){                       changeState(onResolved)                },                onRejected:function(){                       changeState(onRejected)                }            })        }    })    }// 添加catch()方法Promise.prototype.catch = function(onRejected){       return this.then(undefined,onRejected)}// 添加resolve方法Promise.resolve =  function(value) {       return new Promise((resolve,reject) => {           // 判断        if(value instanceof Promise) {               //是Promise对象            value.then(v => {                   resolve(v)            },r => {                   reject(r)            })        }else{               // 不是Promise对象 成功状态            resolve(value)        }    })}

12.Promise.reject()的封装

12.1 代码:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>           </style></head><body>    <script src="a.js"></script>    <script>    const p = Promise.reject(new Promise((resolve,reject) => {            resolve('ok')    }));    console.log(p);        </script></body></html>
// 自定义promise// 声明构造函数function Promise(executor){       // 添加Promise的属性    this.PromiseState = 'pending'    this.PromiseResult = null    // 保存实例对象的this的值    const that = this    // 保存then方法的回调函数    this.callbacks = []    // 保存catch方法的回调函数    this.catchCallbacks = []    // 定义resolve函数    function resolve(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'fulfilled'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onResolved(data)        // 变成数组来保存        that.callbacks.forEach(item => {               item.onResolved()        })    }    // 定义reject函数    function reject(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'rejected'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onRejected(data)        that.callbacks.forEach(item => {               item.onRejected()        })        that.catchCallbacks.forEach(item => {               item.onRejected()        })    }    try {           // 执行executor函数        executor(resolve,reject)    } catch (error) {           reject(error)    }}//添加 then() 方法Promise.prototype.then = function (onResolved,onRejected){      const self = this   // 异常穿透   if(typeof onRejected !== 'function') {          onRejected = reason => {              throw reason       }   }   // 值传递  p.then()......   if(typeof onResolved !== 'function') {           onResolved = value => value    }    return new Promise((resolve,reject) => {           function changeState(type){               try {                   let rs = type(self.PromiseResult)            // 判断            if(rs instanceof Promise) {                   //是Promise对象                rs.then(v => {                       resolve(v)                },r => {                       reject(r)                })            }else{                   // 不是Promise对象 成功状态                resolve(rs)            }            } catch (error) {                   reject(error)            }        }        //执行成功回调函数        if(this.PromiseState === 'fulfilled') changeState(onResolved)        //执行失败回调函数        if(this.PromiseState === 'rejected') changeState(onRejected)        // 保存回调函数        if(this.PromiseState === 'pending') {               this.callbacks.push({                   onResolved:function(){                       changeState(onResolved)                },                onRejected:function(){                       changeState(onRejected)                }            })        }    })    }// 添加catch()方法Promise.prototype.catch = function(onRejected){       return this.then(undefined,onRejected)}// 添加resolve方法Promise.resolve =  function(value) {       return new Promise((resolve,reject) => {           // 判断        if(value instanceof Promise) {               //是Promise对象            value.then(v => {                   resolve(v)            },r => {                   reject(r)            })        }else{               // 不是Promise对象 成功状态            resolve(value)        }    })}// 添加reject方法Promise.reject =  function(value) {       return new Promise((resolve,reject) => {           reject(value)    })}

13.Promise.all()的封装

13.1 代码:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>           </style></head><body>    <script src="a.js"></script>    <script>    const p = Promise.resolve(new Promise((resolve,reject) => {            resolve('ok')    }));    const p1 = Promise.reject('err')    const p2 = Promise.resolve('yes')    const rs = Promise.all([p,p1,p2])    console.log(rs);        </script>   </body></html>
// 自定义promise// 声明构造函数function Promise(executor){       // 添加Promise的属性    this.PromiseState = 'pending'    this.PromiseResult = null    // 保存实例对象的this的值    const that = this    // 保存then方法的回调函数    this.callbacks = []    // 保存catch方法的回调函数    this.catchCallbacks = []    // 定义resolve函数    function resolve(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'fulfilled'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onResolved(data)        // 变成数组来保存        that.callbacks.forEach(item => {               item.onResolved()        })    }    // 定义reject函数    function reject(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'rejected'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onRejected(data)        that.callbacks.forEach(item => {               item.onRejected()        })        that.catchCallbacks.forEach(item => {               item.onRejected()        })    }    try {           // 执行executor函数        executor(resolve,reject)    } catch (error) {           reject(error)    }}//添加 then() 方法Promise.prototype.then = function (onResolved,onRejected){      const self = this   // 异常穿透   if(typeof onRejected !== 'function') {          onRejected = reason => {              throw reason       }   }   // 值传递  p.then()......   if(typeof onResolved !== 'function') {           onResolved = value => value    }    return new Promise((resolve,reject) => {           function changeState(type){               try {                   let rs = type(self.PromiseResult)            // 判断            if(rs instanceof Promise) {                   //是Promise对象                rs.then(v => {                       resolve(v)                },r => {                       reject(r)                })            }else{                   // 不是Promise对象 成功状态                resolve(rs)            }            } catch (error) {                   reject(error)            }        }        //执行成功回调函数        if(this.PromiseState === 'fulfilled') changeState(onResolved)        //执行失败回调函数        if(this.PromiseState === 'rejected') changeState(onRejected)        // 保存回调函数        if(this.PromiseState === 'pending') {               this.callbacks.push({                   onResolved:function(){                       changeState(onResolved)                },                onRejected:function(){                       changeState(onRejected)                }            })        }    })    }// 添加catch()方法Promise.prototype.catch = function(onRejected){       return this.then(undefined,onRejected)}// 添加resolve方法Promise.resolve =  function(value) {       return new Promise((resolve,reject) => {           // 判断        if(value instanceof Promise) {               //是Promise对象            value.then(v => {                   resolve(v)            },r => {                   reject(r)            })        }else{               // 不是Promise对象 成功状态            resolve(value)        }    })}// 添加reject方法Promise.reject =  function(value) {       return new Promise((resolve,reject) => {           reject(value)    })}// 添加all方法Promise.all = function (promises){       return new Promise((resolve,reject) => {           let count = 0        let arr = []        for(let i = 0;i < promises.length;i++){               promises[i].then(v => {                   count++                arr[i] = v                if(count == promises.length) {                       resolve(arr)                }            }, r => {                   reject(r)            })        }    })}

14.Promise.race()的封装

14.1 代码:

在这里插入代码片<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>           </style></head><body>    <script src="a.js"></script>    <script>    const p =new Promise((resolve,reject) => {           setTimeout(function (){             resolve('ok')       },1000)    })    const p1 = Promise.resolve('err')    const p2 = Promise.resolve('yes')    const rs = Promise.race([p,p1,p2])    console.log(rs);        </script>   </body></html>
在这里插入代码片// 自定义promise// 声明构造函数function Promise(executor){       // 添加Promise的属性    this.PromiseState = 'pending'    this.PromiseResult = null    // 保存实例对象的this的值    const that = this    // 保存then方法的回调函数    this.callbacks = []    // 保存catch方法的回调函数    this.catchCallbacks = []    // 定义resolve函数    function resolve(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'fulfilled'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onResolved(data)        // 变成数组来保存        that.callbacks.forEach(item => {               item.onResolved()        })    }    // 定义reject函数    function reject(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'rejected'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onRejected(data)        that.callbacks.forEach(item => {               item.onRejected()        })        that.catchCallbacks.forEach(item => {               item.onRejected()        })    }    try {           // 执行executor函数        executor(resolve,reject)    } catch (error) {           reject(error)    }}//添加 then() 方法Promise.prototype.then = function (onResolved,onRejected){      const self = this   // 异常穿透   if(typeof onRejected !== 'function') {          onRejected = reason => {              throw reason       }   }   // 值传递  p.then()......   if(typeof onResolved !== 'function') {           onResolved = value => value    }    return new Promise((resolve,reject) => {           function changeState(type){               try {                   let rs = type(self.PromiseResult)            // 判断            if(rs instanceof Promise) {                   //是Promise对象                rs.then(v => {                       resolve(v)                },r => {                       reject(r)                })            }else{                   // 不是Promise对象 成功状态                resolve(rs)            }            } catch (error) {                   reject(error)            }        }        //执行成功回调函数        if(this.PromiseState === 'fulfilled') changeState(onResolved)        //执行失败回调函数        if(this.PromiseState === 'rejected') changeState(onRejected)        // 保存回调函数        if(this.PromiseState === 'pending') {               this.callbacks.push({                   onResolved:function(){                       changeState(onResolved)                },                onRejected:function(){                       changeState(onRejected)                }            })        }    })    }// 添加catch()方法Promise.prototype.catch = function(onRejected){       return this.then(undefined,onRejected)}// 添加resolve方法Promise.resolve =  function(value) {       return new Promise((resolve,reject) => {           // 判断        if(value instanceof Promise) {               //是Promise对象            value.then(v => {                   resolve(v)            },r => {                   reject(r)            })        }else{               // 不是Promise对象 成功状态            resolve(value)        }    })}// 添加reject方法Promise.reject =  function(value) {       return new Promise((resolve,reject) => {           reject(value)    })}// 添加all方法Promise.all = function (promises){       return new Promise((resolve,reject) => {           let count = 0        let arr = []        for(let i = 0;i < promises.length;i++){               promises[i].then(v => {                   count++                arr[i] = v                if(count == promises.length) {                       resolve(arr)                }            }, r => {                   reject(r)            })        }    })}// 添加all方法Promise.race = function (promises){       return new Promise((resolve,reject) => {           for(let i = 0;i < promises.length;i++){               promises[i].then(v => {                   resolve(v)            }, r => {                   reject(r)            })        }    })}

15.then方法–回调的异步执行

15.1 代码:

错误结果:

在这里插入图片描述

加个定时器:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>           </style></head><body>    <script src="a.js"></script>    <script>    const p =new Promise((resolve,reject) => {           resolve('ok')       console.log(111);    })    p.then(v => {            console.log(222);            },r  => {            console.log(222);    })    console.log(333);        </script>   </body></html>
// 自定义promise// 声明构造函数function Promise(executor){       // 添加Promise的属性    this.PromiseState = 'pending'    this.PromiseResult = null    // 保存实例对象的this的值    const that = this    // 保存then方法的回调函数    this.callbacks = []    // 保存catch方法的回调函数    this.catchCallbacks = []    // 定义resolve函数    function resolve(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'fulfilled'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onResolved(data)        // 变成数组来保存        setTimeout(function () {                            that.callbacks.forEach(item => {                   item.onResolved()            })        },1000)    }    // 定义reject函数    function reject(data){           if(that.PromiseState !== 'pending') return;        // 改变Promise对象状态        that.PromiseState = 'rejected'        // 改变Promise对象结果        that.PromiseResult = data        // if(that.callback) that.callback.onRejected(data)        that.callbacks.forEach(item => {               item.onRejected()        })        setTimeout(function () {                       that.catchCallbacks.forEach(item => {                   item.onRejected()            })        },1000)    }    try {           // 执行executor函数        executor(resolve,reject)    } catch (error) {           reject(error)    }}//添加 then() 方法Promise.prototype.then = function (onResolved,onRejected){      const self = this   // 异常穿透   if(typeof onRejected !== 'function') {          onRejected = reason => {              throw reason       }   }   // 值传递  p.then()......   if(typeof onResolved !== 'function') {           onResolved = value => value    }    return new Promise((resolve,reject) => {           function changeState(type){               try {                   let rs = type(self.PromiseResult)            // 判断            if(rs instanceof Promise) {                   //是Promise对象                rs.then(v => {                       resolve(v)                },r => {                       reject(r)                })            }else{                   // 不是Promise对象 成功状态                resolve(rs)            }            } catch (error) {                   reject(error)            }        }        //执行成功回调函数        if(this.PromiseState === 'fulfilled'){               setTimeout(function () {                   changeState(onResolved)            },1000)        }        //执行失败回调函数        if(this.PromiseState === 'rejected'){               setTimeout(function () {                   changeState(onRejected)            },1000)        }        // 保存回调函数        if(this.PromiseState === 'pending') {               this.callbacks.push({                   onResolved:function(){                       changeState(onResolved)                },                onRejected:function(){                       changeState(onRejected)                }            })        }    })    }// 添加catch()方法Promise.prototype.catch = function(onRejected){       return this.then(undefined,onRejected)}// 添加resolve方法Promise.resolve =  function(value) {       return new Promise((resolve,reject) => {           // 判断        if(value instanceof Promise) {               //是Promise对象            value.then(v => {                   resolve(v)            },r => {                   reject(r)            })        }else{               // 不是Promise对象 成功状态            resolve(value)        }    })}// 添加reject方法Promise.reject =  function(value) {       return new Promise((resolve,reject) => {           reject(value)    })}// 添加all方法Promise.all = function (promises){       return new Promise((resolve,reject) => {           let count = 0        let arr = []        for(let i = 0;i < promises.length;i++){               promises[i].then(v => {                   count++                arr[i] = v                if(count == promises.length) {                       resolve(arr)                }            }, r => {                   reject(r)            })        }    })}// 添加all方法Promise.race = function (promises){       return new Promise((resolve,reject) => {           for(let i = 0;i < promises.length;i++){               promises[i].then(v => {                   resolve(v)            }, r => {                   reject(r)            })        }    })}

15.class版本的实现

15.1 代码:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>           </style></head><body>    <script src="a.js"></script>    <script>    const p =new Promise((resolve,reject) => {          setTimeout(function (){            resolve('ok')      },1000)    })    p.then(v => {            console.log(222);            },r  => {            console.log(222);    })    console.log(p);        </script>   </body></html>
// 自定义promiseclass Promise {       constructor(executor){           // 添加Promise的属性        this.PromiseState = 'pending'        this.PromiseResult = null        // 保存实例对象的this的值        const that = this        // 保存then方法的回调函数        this.callbacks = []        // 保存catch方法的回调函数        this.catchCallbacks = []        // 定义resolve函数        function resolve(data){               if(that.PromiseState !== 'pending') return;            // 改变Promise对象状态            that.PromiseState = 'fulfilled'            // 改变Promise对象结果            that.PromiseResult = data            // if(that.callback) that.callback.onResolved(data)            // 变成数组来保存            setTimeout(function () {                                that.callbacks.forEach(item => {                       item.onResolved()                })            },1000)        }        // 定义reject函数        function reject(data){               if(that.PromiseState !== 'pending') return;            // 改变Promise对象状态            that.PromiseState = 'rejected'            // 改变Promise对象结果            that.PromiseResult = data            // if(that.callback) that.callback.onRejected(data)            that.callbacks.forEach(item => {                   item.onRejected()            })            setTimeout(function () {                           that.catchCallbacks.forEach(item => {                       item.onRejected()                })            },1000)        }        try {               // 执行executor函数            executor(resolve,reject)        } catch (error) {               reject(error)        }    }    //添加 then() 方法    then(onResolved,onRejected){       const self = this    // 异常穿透    if(typeof onRejected !== 'function') {           onRejected = reason => {               throw reason        }    }    // 值传递  p.then()......    if(typeof onResolved !== 'function') {               onResolved = value => value        }        return new Promise((resolve,reject) => {               function changeState(type){                   try {                       let rs = type(self.PromiseResult)                // 判断                if(rs instanceof Promise) {                       //是Promise对象                    rs.then(v => {                           resolve(v)                    },r => {                           reject(r)                    })                }else{                       // 不是Promise对象 成功状态                    resolve(rs)                }                } catch (error) {                       reject(error)                }            }            //执行成功回调函数            if(this.PromiseState === 'fulfilled'){                   setTimeout(function () {                       changeState(onResolved)                },1000)            }            //执行失败回调函数            if(this.PromiseState === 'rejected'){                   setTimeout(function () {                       changeState(onRejected)                },1000)            }            // 保存回调函数            if(this.PromiseState === 'pending') {                   this.callbacks.push({                       onResolved:function(){                           changeState(onResolved)                    },                    onRejected:function(){                           changeState(onRejected)                    }                })            }        })            }    // 添加catch()方法    catch(onRejected){           return this.then(undefined,onRejected)    }    // 添加resolve方法    static resolv(value) {           return new Promise((resolve,reject) => {               // 判断            if(value instanceof Promise) {                   //是Promise对象                value.then(v => {                       resolve(v)                },r => {                       reject(r)                })            }else{                   // 不是Promise对象 成功状态                resolve(value)            }        })    }    // 添加reject方法    static reject(value) {           return new Promise((resolve,reject) => {               reject(value)        })    }    // 添加all方法   static all(promises){           return new Promise((resolve,reject) => {               let count = 0            let arr = []            for(let i = 0;i < promises.length;i++){                   promises[i].then(v => {                       count++                    arr[i] = v                    if(count == promises.length) {                           resolve(arr)                    }                }, r => {                       reject(r)                })            }        })    }    // 添加all方法    static race(promises){           return new Promise((resolve,reject) => {               for(let i = 0;i < promises.length;i++){                   promises[i].then(v => {                       resolve(v)                }, r => {                       reject(r)                })            }        })    }}
上一篇:obj.fn()
下一篇:Promise先指定回调函数还是先改变状态?

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年04月05日 01时02分53秒