Promise

作者: 迷失的信徒 | 来源:发表于2022-04-17 15:47 被阅读0次

一、什么是Promise

简单的来说就是异步变成的一种解决方案,也可以理解成一个容器,里面存放着异步操作的结果。

1.1、promise特点
  • 对象的状态不受外界影响。promsie对象有三种状态: pending(进行中), fulfilled(已成功)和rejected(已失败)。只有异步操作的结果可以决定当前的状态,不受任何其他因素的影响。
    • pending:等待状态,比如正在进行网络请求时,或者定时器没有到时间。
    • fulfill:满足状态,当我们主动回调resolve时,就处于该状态,并且会回调.then()
    • reject:拒绝状态,当我们主动回调了reject时,就处于该状态,并回调.catch()
  • 一旦改变状态,就不会再变。 promise的状态改变,只有两种可能: pending => fulfilledpending => rejected.只有命中其中一种,那么状态就被凝固了。与事件不同的是: 状态改变了,再对promise对象添加回调函数也是会得到这个凝固的值。
  • 避免回调地狱(嵌套函数),代码更加优雅;利用promise可以实现链式调用,就可以将异步操作以同步操作的流程表达出,避免回调地狱的产生,并且promise对象也提供统一的接口,可以更加容易的操作异步操作。
1.2、promise的缺点
  • 无法取消promsie,因为promsie一旦new出来就是会立即执行的,无法中途取消。
  • 不设置回调函数,无法捕获到promise内部抛出的错误。
  • 处于pending阶段的时候,无法得知当前进行的阶段(刚刚开始还是即将完成)

二、Promise的基本使用

本文都采用setTimeout()函数来表示异步操作

2.1、最基本使用
            //参数 => 函数(resolve,reject)
            //resolve、reject本身也是函数
            //链式编程  
            //什么情况下会用到Promise?
            //一般情况下是有异步操作时,使用Pronmise对这个异步操作进行封装
            new Promise((resolve,reject) => {
                setTimeout(() => {
                    resolve(aa)//这里可以带参数,意成功之后调用
                    reject(err)//带参,失败后调用----
                })
            }).then((aa => {
                //这里是成功之后的处理
            }).catch((err) => {
                //这里是失败之后的处理
            })

场景:根据请求一的结果来进行过请求二,然后根据请求二的结果来完成请求三的数据处理。

            new Promise((resolve,reject) => {
                //1、第一次的异步操作
                setTimeout(() => {
                    resolve(data)
                },1000)
            }).then(data => {
                //1、第一次的结果处理
                console.log('1');
                return new Promise((resolve,reject) => {
                    //2、第二次的异步操作
                    setTimeout(() => {
                        resolve()
                    },1000)
                })
            }).then(() => {
                //2、第二次的结果处理
                console.log(2);
                return new Promise((resolve,reject) => {
                    //3、第三次的异步操作
                    setTimeout(() => {
                        resolve()
                    },1000)
                })
            }).then(() => {
                //3、第三次的结果处理
                console.log('3');
            })
2.2、Promise简写
  • 1、没有异步处理只有结果运算时,可以不传reject
            new Promise((resolve,reject) => {
                setTimeout(() => {
                    resolve('aaa')
                },1000)
            }).then(res => {
                console.log(res);
                //没有异步处理,只有结果运算的,可以不传reject(可选)
                return new Promise(resolve => {
                    resolve('111' + res)
                })
            }).then(res => {
                console.log(res);
            })
  • 2、对上面代码中return中resolve的简写
            //resolve简写
            new Promise((resolve,reject) => {
                setTimeout(() => {
                    resolve('aaa')
                },1000)
            }).then(res => {
                console.log(res);
                //没有异步处理,只有结果运算的,可以不传reject(可选)
                return new Promise.resolve('111' + res)
            }).then(res => {
                console.log(res);
            })
  • 3、还可继续简写成:省略掉了Promise.resolve,直接return
            new Promise((resolve,reject) => {
                setTimeout(() => {
                    resolve('aaa')
                },1000)
            }).then(res => {
                console.log(res);
                //没有异步处理,只有结果运算的,可以不传reject(可选)
                return '111' + res
            }).then(res => {
                console.log(res);
            })
2.3、也可通过throw来抛出异常
new Promise((resolve,reject) => {
                setTimeout(() => {
                    resolve('aaa')
                },1000)
            }).then(res => {
                console.log(res);
                //没有异步处理,只有结果运算的,可以不传reject(可选)
                // return Promise.reject('err')
                throw 'err'
            }).catch(err => {
                console.log(err);
            })

三、all方法的使用

场景:根据请求一二的结果来处理后续的事情

Promise.all([
                new Promise((resolve,reject) => {
                    //第一次网络请求
                    setTimeout(() => {
                        resolve('aaa')//第一次请求成功
                    })
                }),
                new Promise((resolve,reject) => {
                    //第二次网络请求
                    setTimeout(() => {
                        resolve('bbb')//第二次请求成功
                    })
                })
            ]).then(results => {//这里的results为一个数组,里面存放的就是,上面数组对应网络请求的结果
                console.log(results);
            })

相关文章

网友评论

      本文标题:Promise

      本文链接:https://www.haomeiwen.com/subject/qbllertx.html