Promise笔记

Promise

Promise的初体验

具体看html文件中写的

Promise的状态

  • 实例对象中的一个属性PromiseState

 

  • pending 未决定的

  • resolve / fullfilled 成功

  • rejected 失败

状态的改变只有两种形式:

  • pending 变为 resolved

  • pending 变为 rejected

说明:只有这两种状态 且一个promise对象只能改变一次 无论变为成功还是失败 都会有一个结果数据 成功的结果数据一般称为value 失败的结果数据一般称为resaon

Promise对象的值

  • 实例对象中的另一个属性PromiseResult

 

  • 保存着异步任务成功/失败的结果

  • resolve 和 reject 这两个函数可以对其进行修改(传参) 其他的是不可以的

 

Promise的工作流程

Promise API

Promise构造函数:Promise(excutor{})

  • excutor函数:执行器 (resolve,reject)=> { }

  • resolve函数:内部定义成功时我们调用的函数 value => { }

  • reject函数:内部定义失败时我们调用的函数 reason => { }

说明:excutor会在内部立即同步调用,异步操作在执行器中调用 

        let p = new Promise((resolve,reject)=>{
            // 同步调用的
            console.log(111)
        })
        console.log(222)

 

Promise.prototype.then方法:(onResolved,onRejected)=>{}

  • onResolved函数:成功的回调函数(value)=> {}

  • onRejected函数:失败的回调函数(reason)=>{}

说明:指定用于得到成功value的成功回调和用于得到失败reason的失败回调 返回一个新的promise对象

Promise.prototype.catch方法:(onRejected)=>{}

  • onRejected函数:失败的回调函数(reason)=>{}

        let p = new Promise((resolve,reject)=>{
            // 修改promise对象的状态
            reject('error')
        })
​
        // 执行 catch方法
        p.catch(reason =>{
            console.log(reason)
        })

 

promise.resolve方法:(value)=>{}

  • value:成功的数据或者promise对象

说明:返回一个成功/失败的promise对象

        let p1 = Promise.resolve(521);
        //如果传入的参数为 非Promise类型的对象, 则返回的结果为成功promise对象
        //如果传入的参数为 Promise 对象, 则参数的结果决定了 resolve 的结果
        let p2 = Promise.resolve(new Promise((resolve, reject) => {
            // resolve('OK');
            reject('Error');
        }));
        // console.log(p1);
        // console.log(p2);
        p2.catch(reason => {
            console.log(reason);
        })

Promise.reject方法:(reason)=>{}

  • reason:失败的原因

说明:返回一个失败的promise对象

        let p = Promise.reject(123)
        let p1 = Promise.reject(new Promise((resolve,reject)=>{
            resolve("ok")
        }))
        console.log(p)
        console.log(p1)
//不管传入什么都是失败

 

Promise.all方法:(promises)=>{}

  • promises:包含n个promise的数组

说明:返回一个新的promise 只有所有的promise都成功才成功 只要有一个失败就直接失败

  • 成功:返回的结果是一个成功的数组

        let p1 = new Promise((resolve,reject)=>{
            resolve("ok")
        })
        let p2 = Promise.resolve("SUCCESS")
        let p3 = Promise.resolve("oh Yeah")
        
        const result = Promise.all([p1,p2,p3])
        console.log(result)

 

 

  • 失败:返回的失败的结果值

        let p1 = new Promise((resolve,reject)=>{
            resolve("ok")
        })
        // let p2 = Promise.resolve("SUCCESS")
        let p2 = Promise.reject("error")
        let p3 = Promise.resolve("oh Yeah")
        
        const result = Promise.all([p1,p2,p3])
        console.log(result)

 

 

Promise.race方法:(promises)=>{}

  • promises:包含n个promise的数组

说明:返回一个新的promise 第一个完成的promise的结果状态就是最终的状态 返回的结果就是数组中第一个promise的结果

        let p1 = new Promise((resolve,reject)=>{
            resolve("ok")
        })
        // let p2 = Promise.resolve("SUCCESS")
        let p2 = Promise.reject("error")
        let p3 = Promise.resolve("oh Yeah")
​
        let result = Promise.race([p2,p1,p3])
        console.log(result)

 

 

Promise的几个关键问题

如何改变 promise 的状态?

  • resolve(value): 如果当前是 pending 就会变为 resolved

  • reject(reason): 如果当前是 pending 就会变为 rejected

  • 抛出异常: 如果当前是 pending 就会变为 rejected

        let p = new Promise((resolve, reject) => {
            // 1.resolve
            // resolve('ok') //pending => fulfilled(resolved)
            // 2.reject
            // reject('err') //pending => rejected
            // 3.抛出错误
            // throw '出问题了'
        });
​
        console.log(p);

一个 promise 指定多个成功/失败回调函数, 都会调用吗?

  • 当 promise 改变为对应状态时都会调用

        let p = new Promise((resolve, reject) => {
            resolve('OK');
            //当注释掉这个resolve()时 这个p的状态没有发生改变 所以不会执行回调
            //!!!!只有当promise的对应状态改变时才会发生回调
        });
​
        ///指定回调 - 1
        p.then(value => {
            console.log(value);
        });
​
        //指定回调 - 2
        p.then(value => {
            alert(value);
        });

改变 promise 状态和指定回调函数谁先谁后?

题意:promise代码在运行时 改变状态(resolve()/reject())先执行 还是 then方法先执行

  • 都有可能, 正常情况下是先指定回调再改变状态, 但也可以先改状态再指定回调

  • 如何先改状态再指定回调?

    • 在执行器中直接调用 resolve()/reject()

    • 延迟更长时间才调用 then()

  • 什么时候才能得到数据?

    • 如果先指定的回调, 那当状态发生改变时, 回调函数就会调用, 得到数据 (这种是加了定时器的 意思是:会先去执行then方法 然后回过头来resolve()改变状态 然后再去执行then里面的代码获取数据)(指定回调->改变状态->执行回调)

    • 如果先改变的状态, 那当指定回调时, 回调函数就会调用, 得到数据 (改变状态->指定回调->执行回调)

        let p = new Promise((resolve, reject) => {
            // setTimeout(() => {
                resolve('OK');
            // }, 1000);
        });
​
        p.then(value => {
            console.log(value);
        },reason=>{
            
        })
​
// 1.不加定时器的话 因为是同步任务 先会执行resolve改变状态 然后执行then方法  一般来说都是第一种
// 2.加定时器的话 变成了异步任务 会先调用then方法 然后resolve改变状态 然后再执行then方法
​
//天王老子来了都是先变状态再执行回调

promise.then()返回的新 promise 的结果状态由什么决定?

  • 简单表达: 由 then()指定的回调函数执行的结果决定

  • 详细表达:

    • 如果抛出异常, 新 promise 变为 rejected, reason 为抛出的异常

    • 如果返回的是非 promise 的任意值, 新 promise 变为 resolved, value 为返回的值

    • 如果返回的是另一个新 promise, 此 promise 的结果就会成为新 promise 的结果

        let p = new Promise((resolve, reject) => {
            resolve('ok');
        });
​
        //执行 then 方法
        let result = p.then(value => {
            console.log(value);
            //1. 抛出错误
            // throw '出了问题';
            //2. 返回结果是非 Promise 类型的对象
            // return 521;
            //3. 返回结果是 Promise 对象
            return new Promise((resolve, reject) => {
                resolve('success');
                // reject('error');
            });
        }, reason => {
            console.warn(reason);
        });
​
        console.log(result);

promise 如何串连多个操作任务?

  • promise 的 then()返回一个新的 promise, 可以开成 then()的链式调用

  • 通过 then 的链式调用串连多个同步/异步任务

        let p = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('OK');
            }, 1000);
        });
​
        p.then(value => {
            return new Promise((resolve, reject) => {
                resolve("success");
            });
        }).then(value => {
            console.log(value);
        }).then(value => {
            console.log(value);
        })

 

 

promise 异常传透?

  • 当使用 promise 的 then 链式调用时, 可以在最后指定失败的回调,

  • 前面任何操作出了异常, 都会传到最后失败的回调中处理

       
 let p = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('OK');
                // reject('Err');
            }, 1000);
        });
​
        p.then(value => {
            // console.log(111);
            throw '失败啦!';
        }).then(value => {
            console.log(222);
        }).then(value => {
            console.log(333);
        }).catch(reason => {
            console.warn(reason);
        });

 

 

中断 promise 链?

  • 有且只有一个方式 返回一个pending状态的Promise!!!! 因为!!只有状态发生改变 才会执行then回调 pending状态没有发生改变 所以接下来的链式promise会被中断

       
 let p = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('OK');
            }, 1000);
        });
​
        p.then(value => {
            console.log(111);
            //有且只有一个方式
            return new Promise(() => {});
        }).then(value => {
            console.log(222);
        }).then(value => {
            console.log(333);
        }).catch(reason => {
            console.warn(reason);
        });

Promise自定义封装(手写Promise)

自定义封装resolve 和 rejected

//声明构造函数
function Promise(executor){
    //添加属性
    this.PromiseState = 'pending';
    this.PromiseResult = null;
    //保存实例对象的 this 的值
    const self = this;// self _this that
    //resolve 函数
    function resolve(data){
        //1. 修改对象的状态 (promiseState)
        self.PromiseState = 'fulfilled';// resolved
        //2. 设置对象结果值 (promiseResult)
        self.PromiseResult = data;
    }
    //reject 函数
    function reject(data){
        //1. 修改对象的状态 (promiseState)
        self.PromiseState = 'rejected';// 
        //2. 设置对象结果值 (promiseResult)
        self.PromiseResult = data;
    }
​
    //同步调用『执行器函数』
    executor(resolve, reject);
}
​
//添加 then 方法
Promise.prototype.then = function(onResolved, onRejected){
​
}

抛出异常改变状态

  
  try{
        //同步调用『执行器函数』
        executor(resolve, reject);
    }catch(e){
        //修改 promise 对象状态为『失败』
        reject(e);
    }

Promise对象的状态只能修改一次

  • 原来的Promise对象

      
  let p = new Promise((resolve, reject) => {
            reject("error");
            resolve('OK');
            //抛出异常
            // throw "error";
        });
//这个改变的两次状态 按照原来的Promise对象 then方法输出的是error 状态是rejected 只能改变一次状态 所以下面的resolve不会执行 手写Promise下面的代码块可以实现这个功能
if(self.PromiseState !== 'pending') return;

then方法执行回调

//添加 then 方法
Promise.prototype.then = function(onResolved, onRejected){
    //调用回调函数  PromiseState
    if(this.PromiseState === 'fulfilled'){
        onResolved(this.PromiseResult);
    }
    if(this.PromiseState === 'rejected'){
        onRejected(this.PromiseResult);
    }
}

异步任务回调的执行

       //实例化对象
        let p = new Promise((resolve, reject) => {
            setTimeout(() => {
                // resolve('OK');
                reject("error");
            }, 1000);
        });
​
        p.then(value => {
            console.log(value);
        }, reason=>{
            console.warn(reason);
        });
​
        console.log(p);

因为上面重写到Promise的步骤是只有状态改变了才会执行then方法,上面的html代码 先会执行回调发现状态还是pending 没有改变 等到一秒后resolve异步执行时 then方法早已执行过了 所以没有任何的输出

  • 修改后

//在Promise中加一个callback属性
this.callback = {};
//在resolve函数中
//调用成功的回调函数
if(self.callback.onResolved){
   self.callback.onResolved(data);
}
//失败的回调函数中同上
​
​
//then方法中
//判断 pending 状态
    if(this.PromiseState === 'pending'){
        //保存回调函数
        this.callback = {
            onResolved: onResolved,
            onRejected: onRejected
        }
    }

指定多个回调的实现

按照上面的代码callback是一个对象 如果执行多个then方法 下面的then方法会将上面的覆盖掉 只会输出最后一个then的回调

       
 p.then(value => {
            console.log(value);
        }, reason=>{
            console.warn(reason);
        });
​
        p.then(value => {
            alert(value);
        }, reason=>{
            alert(reason);
        });
  • 修改后 将callback变为一个数组 就可以执行多个回调了

   
 this.callbacks = [];
     //调用成功的回调函数
     self.callbacks.forEach(item => {
          item.onResolved(data);
     });
     //执行失败的回调
     self.callbacks.forEach(item => {
          item.onRejected(data);
     });
​
    //判断 pending 状态
    if(this.PromiseState === 'pending'){
        //保存回调函数
        this.callbacks.push({
            onResolved: onResolved,
            onRejected: onRejected
        });
    }

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

有点绕

  • 在then方法中让它的返回值是一个Promise return new Promise

  • 判断then的返回值

 

 

  • 上面这一块的东西就是等价于 let result = onResolved(this.PromiseResult); 就是判断它return的返回值是什么 (没有返回值 返回的就是undefined)

  • 判断这个返回值是不是promise 再进行响应的操作

//添加 then 方法
Promise.prototype.then = function(onResolved, onRejected){
    return new Promise((resolve, reject) => {
        //调用回调函数  PromiseState
        if(this.PromiseState === 'fulfilled'){
            try{
                //获取回调函数的执行结果
                let result = onResolved(this.PromiseResult);
                //判断
                if(result instanceof Promise){
                    //如果是 Promise 类型的对象
                    result.then(v => {
                        resolve(v);
                    }, r=>{
                        reject(r);
                    })
                }else{
                    //结果的对象状态为『成功』
                    resolve(result);
                }
            }catch(e){
                reject(e);
            }
        }
        if(this.PromiseState === 'rejected'){
            onRejected(this.PromiseResult);
        }
        //判断 pending 状态
        if(this.PromiseState === 'pending'){
            //保存回调函数
            this.callbacks.push({
                onResolved: onResolved,
                onRejected: onRejected
            });
        }
    })
}

异步修改状态then方法结果返回

修改前

        
//实例化对象
        let p = new Promise((resolve, reject) => {
            setTimeout(() => {
               resolve('OK');
            }, 1000)
        });
​
        //执行 then 方法
        const res = p.then(value => {
            console.log(value)
        }, reason=>{
​
        });
​
        console.log(res);
  • 修改前的代码因为异步 会先执行then方法 因为状态没有改变 所以PromiseState = pending

 

 

  • 因为这里没有resolve 和 reject 所以then的状态没有发生改变 所以console.log(res)还是pending

修改后

       
 //判断 pending 状态
        if(this.PromiseState === 'pending'){
            //保存回调函数
            this.callbacks.push({
                onResolved: function(){
                    try{
                        //执行成功回调函数
                        let result = onResolved(self.PromiseResult);
                        //判断
                        if(result instanceof Promise){
                            result.then(v => {
                                resolve(v);
                            }, r=>{
                                reject(r);
                            })
                        }else{
                            resolve(result);
                        }
                    }catch(e){
                        reject(e);
                    }
                },
                onRejected: function(){
                    try{
                        //执行成功回调函数
                        let result = onRejected(self.PromiseResult);
                        //判断
                        if(result instanceof Promise){
                            result.then(v => {
                                resolve(v);
                            }, r=>{
                                reject(r);
                            })
                        }else{
                            resolve(result);
                        }
                    }catch(e){
                        reject(e);
                    }
                }
            });
        }

then方法的完善与优化

  • 因为下面这一块的代码重复使用 所以将这块代码封装一样 好维护

 

//添加 then 方法
Promise.prototype.then = function(onResolved, onRejected){
    const self = this;
    return new Promise((resolve, reject) => {
        //封装函数
        function callback(type){
            try{
                //获取回调函数的执行结果
                let result = type(self.PromiseResult);
                //判断
                if(result instanceof Promise){
                    //如果是 Promise 类型的对象
                    result.then(v => {
                        resolve(v);
                    }, r=>{
                        reject(r);
                    })
                }else{
                    //结果的对象状态为『成功』
                    resolve(result);
                }
            }catch(e){
                reject(e);
            }
        }
        
        //调用回调函数  PromiseState
        if(this.PromiseState === 'fulfilled'){
            callback(onResolved);
        }
        if(this.PromiseState === 'rejected'){
            callback(onRejected);
        }
        //判断 pending 状态
        if(this.PromiseState === 'pending'){
            //保存回调函数
            this.callbacks.push({
                onResolved: function(){
                    callback(onResolved);
                },
                onRejected: function(){
                    callback(onRejected);
                }
            });
        }
    })
}

catch方法 异常穿透与值传递

catch方法实现

//添加 catch 方法
Promise.prototype.catch = function(onRejected){
    return this.then(undefined, onRejected);
}

异常穿透

 

因为这个then没有传失败 reason的回调 所以then的第二个参数就变成了 undefined 所以在我们写的代码中 onRejected就不是一个函数了它是undefined

 

 

  • 就变成了 undefined(self.PromiseResult) 就会报错

    修改后

  •  

       
     //判断回调函数参数
        if(typeof onRejected !== 'function'){
            onRejected = reason => {
                throw reason;
            }
        }

值传递(与异常穿透同理)

    if(typeof onResolved !== 'function'){
        onResolved = value => value;
        //value => { return value};
    }

Promise.resolve的封装

  • 返回的状态的成功与失败 取决于传进来的值或者Promise的成功与失败

//添加 resolve 方法
Promise.resolve = function(value){
    //返回promise对象
    return new Promise((resolve, reject) => {
        if(value instanceof Promise){
            value.then(v=>{
                resolve(v);
            }, r=>{
                reject(r);
            })
        }else{
            //状态设置为成功
            resolve(value);
        }
    });
}

Promise.reject的封装

  • 无论传进来的是什么 返回的都是失败的Promise

//添加 reject 方法
Promise.reject = function(reason){
    return new Promise((resolve, reject)=>{
        reject(reason);
    });
}

Promise.all的封装

  • 只有全部成功 才返回成功的Promise 值为数组

  • 有一个失败 就返回失败的Promise 值为那个失败的resason

//添加 all 方法
Promise.all = function(promises){
    //返回结果为promise对象
    return new Promise((resolve, reject) => {
        //声明变量
        let count = 0;
        let arr = [];
        //遍历
        for(let i=0;i<promises.length;i++){
            //
            promises[i].then(v => {
                //得知对象的状态是成功
                //每个promise对象 都成功
                count++;
                //将当前promise对象成功的结果 存入到数组中
                arr[i] = v;
                //判断
                if(count === promises.length){
                    //修改状态
                    resolve(arr);
                }
            }, r => {
                reject(r);
            });
        }
    });
}

Promise.race的封装

  • 谁先改变状态 返回的就是谁

//添加 race 方法
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);
            })
        }
    });
}

then方法回调的异步执行

      
  let p1 = new Promise((resolve, reject) => {
            resolve('OK');
            console.log(111);
        });
​
        p1.then(value => {
            console.log(222);
        }, reason => {
            console.log(444);
        });
​
        console.log(333);
​
//上面这代码 执行输出的结果应该是
// 111 333 222
//then方法应该是异步执行的
  • 所以我们要在Promise中给then成功失败的回调加上延时器

 

 

 

!!!!手写Promise的全部代码

//声明构造函数
function Promise(executor){
    //添加属性
    this.PromiseState = 'pending';
    this.PromiseResult = null;
    //声明属性
    this.callbacks = [];
    //保存实例对象的 this 的值
    const self = this;// self _this that
    //resolve 函数
    function resolve(data){
        //判断状态
        if(self.PromiseState !== 'pending') return;
        //1. 修改对象的状态 (promiseState)
        self.PromiseState = 'fulfilled';// resolved
        //2. 设置对象结果值 (promiseResult)
        self.PromiseResult = data;
        //调用成功的回调函数
        setTimeout(() => {
            self.callbacks.forEach(item => {
                item.onResolved(data);
            });
        });
    }
    //reject 函数
    function reject(data){
        //判断状态
        if(self.PromiseState !== 'pending') return;
        //1. 修改对象的状态 (promiseState)
        self.PromiseState = 'rejected';// 
        //2. 设置对象结果值 (promiseResult)
        self.PromiseResult = data;
        //执行失败的回调
        setTimeout(() => {
            self.callbacks.forEach(item => {
                item.onRejected(data);
            });
        });
    }
    try{
        //同步调用『执行器函数』
        executor(resolve, reject);
    }catch(e){
        //修改 promise 对象状态为『失败』
        reject(e);
    }
}
​
//添加 then 方法
Promise.prototype.then = function(onResolved, onRejected){
    const self = this;
    //判断回调函数参数
    if(typeof onRejected !== 'function'){
        onRejected = reason => {
            throw reason;
        }
    }
    if(typeof onResolved !== 'function'){
        onResolved = value => value;
        //value => { return value};
    }
    return new Promise((resolve, reject) => {
        //封装函数
        function callback(type){
            try{
                //获取回调函数的执行结果
                let result = type(self.PromiseResult);
                //判断
                if(result instanceof Promise){
                    //如果是 Promise 类型的对象
                    result.then(v => {
                        resolve(v);
                    }, r=>{
                        reject(r);
                    })
                }else{
                    //结果的对象状态为『成功』
                    resolve(result);
                }
            }catch(e){
                reject(e);
            }
        }
        //调用回调函数  PromiseState
        if(this.PromiseState === 'fulfilled'){
            setTimeout(() => {
                callback(onResolved);
            });
        }
        if(this.PromiseState === 'rejected'){
            setTimeout(() => {
                callback(onRejected);
            });
        }
        //判断 pending 状态
        if(this.PromiseState === 'pending'){
            //保存回调函数
            this.callbacks.push({
                onResolved: function(){
                    callback(onResolved);
                },
                onRejected: function(){
                    callback(onRejected);
                }
            });
        }
    })
}
​
//添加 catch 方法
Promise.prototype.catch = function(onRejected){
    return this.then(undefined, onRejected);
}
​
//添加 resolve 方法
Promise.resolve = function(value){
    //返回promise对象
    return new Promise((resolve, reject) => {
        if(value instanceof Promise){
            value.then(v=>{
                resolve(v);
            }, r=>{
                reject(r);
            })
        }else{
            //状态设置为成功
            resolve(value);
        }
    });
}
​
//添加 reject 方法
Promise.reject = function(reason){
    return new Promise((resolve, reject)=>{
        reject(reason);
    });
}
​
//添加 all 方法
Promise.all = function(promises){
    //返回结果为promise对象
    return new Promise((resolve, reject) => {
        //声明变量
        let count = 0;
        let arr = [];
        //遍历
        for(let i=0;i<promises.length;i++){
            //
            promises[i].then(v => {
                //得知对象的状态是成功
                //每个promise对象 都成功
                count++;
                //将当前promise对象成功的结果 存入到数组中
                arr[i] = v;
                //判断
                if(count === promises.length){
                    //修改状态
                    resolve(arr);
                }
            }, r => {
                reject(r);
            });
        }
    });
}
​
//添加 race 方法
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);
            })
        }
    });
}

Class封装Promise

class Promise{
    //构造方法
    constructor(executor){
        //添加属性
        this.PromiseState = 'pending';
        this.PromiseResult = null;
        //声明属性
        this.callbacks = [];
        //保存实例对象的 this 的值
        const self = this;// self _this that
        //resolve 函数
        function resolve(data){
            //判断状态
            if(self.PromiseState !== 'pending') return;
            //1. 修改对象的状态 (promiseState)
            self.PromiseState = 'fulfilled';// resolved
            //2. 设置对象结果值 (promiseResult)
            self.PromiseResult = data;
            //调用成功的回调函数
            setTimeout(() => {
                self.callbacks.forEach(item => {
                    item.onResolved(data);
                });
            });
        }
        //reject 函数
        function reject(data){
            //判断状态
            if(self.PromiseState !== 'pending') return;
            //1. 修改对象的状态 (promiseState)
            self.PromiseState = 'rejected';// 
            //2. 设置对象结果值 (promiseResult)
            self.PromiseResult = data;
            //执行失败的回调
            setTimeout(() => {
                self.callbacks.forEach(item => {
                    item.onRejected(data);
                });
            });
        }
        try{
            //同步调用『执行器函数』
            executor(resolve, reject);
        }catch(e){
            //修改 promise 对象状态为『失败』
            reject(e);
        }
    }
​
    //then 方法封装
    then(onResolved,onRejected){
        const self = this;
        //判断回调函数参数
        if(typeof onRejected !== 'function'){
            onRejected = reason => {
                throw reason;
            }
        }
        if(typeof onResolved !== 'function'){
            onResolved = value => value;
            //value => { return value};
        }
        return new Promise((resolve, reject) => {
            //封装函数
            function callback(type){
                try{
                    //获取回调函数的执行结果
                    let result = type(self.PromiseResult);
                    //判断
                    if(result instanceof Promise){
                        //如果是 Promise 类型的对象
                        result.then(v => {
                            resolve(v);
                        }, r=>{
                            reject(r);
                        })
                    }else{
                        //结果的对象状态为『成功』
                        resolve(result);
                    }
                }catch(e){
                    reject(e);
                }
            }
            //调用回调函数  PromiseState
            if(this.PromiseState === 'fulfilled'){
                setTimeout(() => {
                    callback(onResolved);
                });
            }
            if(this.PromiseState === 'rejected'){
                setTimeout(() => {
                    callback(onRejected);
                });
            }
            //判断 pending 状态
            if(this.PromiseState === 'pending'){
                //保存回调函数
                this.callbacks.push({
                    onResolved: function(){
                        callback(onResolved);
                    },
                    onRejected: function(){
                        callback(onRejected);
                    }
                });
            }
        })
    }
​
    //catch 方法
    catch(onRejected){
        return this.then(undefined, onRejected);
    }
​
    //添加 resolve 方法
    static resolve(value){
        //返回promise对象
        return new Promise((resolve, reject) => {
            if(value instanceof Promise){
                value.then(v=>{
                    resolve(v);
                }, r=>{
                    reject(r);
                })
            }else{
                //状态设置为成功
                resolve(value);
            }
        });
    }
​
    //添加 reject 方法
    static reject(reason){
        return new Promise((resolve, reject)=>{
            reject(reason);
        });
    }
​
    //添加 all 方法
    static all(promises){
        //返回结果为promise对象
        return new Promise((resolve, reject) => {
            //声明变量
            let count = 0;
            let arr = [];
            //遍历
            for(let i=0;i<promises.length;i++){
                //
                promises[i].then(v => {
                    //得知对象的状态是成功
                    //每个promise对象 都成功
                    count++;
                    //将当前promise对象成功的结果 存入到数组中
                    arr[i] = v;
                    //判断
                    if(count === promises.length){
                        //修改状态
                        resolve(arr);
                    }
                }, r => {
                    reject(r);
                });
            }
        });
    }
​
    //添加 race 方法
    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);
                })
            }
        });
    }
}   

async 和 await

async函数

  • 在函数的前面加了async 则这个函数返回的结果就是一个Promise 成功与失败取决于return的类型以及值(它跟then方法返回的结果是一样的)

       
 async function main(){
            //1. 如果返回值是一个非Promise类型的数据
            // return 521;
            //2. 如果返回的是一个Promise对象
            // return new Promise((resolve, reject) => {
            //     // resolve('OK');
            //     reject('Error');
            // });
            //3. 抛出异常
            throw "Oh NO";   
        }
​
        let result = main();
​
        console.log(result);

 

 

await表达式

  • await 右侧的表达式一般为 promise 对象, 但也可以是其它的值

  • 如果表达式是 promise 对象, await 返回的是 promise 成功的值

  • 如果表达式是其它值, 直接将此值作为 await 的返回值

  • !!await主要是获取Promise成功的结果 如果Promise返回的是失败的结果 则会抛出一个错误 需要用try catch来返回失败的结果

       
 async function main(){
            let p = new Promise((resolve, reject) => {
                // resolve('OK');
                reject('Error');
            })
            //1. 右侧为promise的情况
            // let res = await p;
            //2. 右侧为其他类型的数据
            // let res2 = await 20;
            //3. 如果promise是失败的状态
            try{
                let res3 = await p;
            }catch(e){
                console.log(e);
            }
        }
​
        main();

注意

  • await 必须写在 async 函数中, 但 async 函数中可以没有 await

  • 如果 await 的 promise 失败了, 就会抛出异常, 需要通过 try...catch 捕获处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值