Promise是ES6的新特性,是异步编程的一种解决方案
从语法上说,Promise是一个对象,从它可以获取异步操作的消息,可以解决回调地狱(回调地狱嵌套回调函数)
Promise的含义:本身不是异步,是封装异步操作容器,统一异步的标准
Promise对象的特点:对象的状态不受外界影响,一旦状态改变,就不会再变,任何时候都可以得到这个结果
一.前引

js中的异步操作有哪些

1 ajax请求  
2 var xhr = new XMLHttpRequest();
3 xhr.onreadystatechange=function(){}
4 xhr.addEventListener('readystatechange',function(){})
5 浏览器事件
6 ele.onclick=function(){}
7 定时
8 setTime(function(){
9 },1000);

 


2.回调函数

 1 函数的参数是另外一个函数 2 setTime(function(){ 3 },1000); 
二.Promise 的优缺点
优点:
1、将异步操作以同步操作的方式表达出来,避免层层嵌套回调函数
2、提供统一的操作接口,方便对异步操作的控制
缺点:
1、promise一旦建立,则不可取消
2、如果不设置回调函数,则会在promise内部抛出错误,不会反应到外部
3、当状态是pending是,无法判断当前状态(是异步刚刚开始执行还是即将完成了异步操作)
三.状态
1.pending 进行中,当异步操作执行中
2.resolve 操作成功状态
3.rejected 操作失败的状态
四.对原生ajax封装

 1   function aa(method='get',path='1.php'){
 2        return new Promise((f1,f2)=>{
 3            let request = new XMLHttpRequest();
 4            request.open(method,path);
 5            request.send();
 6            request.onreadystatechange=()=>{
 7                if(request.readyState ==4){
 8                    if(request.status ==200){
 9                        f1.call(null,request.responseText)
10                    }else{
11                        f2.call(undefined,request.status)
12                    }
13                }
14            }
15        })    
16    }
17     aa('get','1.php').then(function(da){
18          console.log(da)
19     }).then(function(da){
20          aa('get','2.php').then(function(da){
21              console.log(da)
22          })
23     })

 


五.Promise基本API
1.实例方法
1 .then() 得到异步任务正确的结果
2 .catch() 获取异常信息
3 .finally() 方法用于指定不管Promise对象最后状态如何,都会执行的操作
成功与否都会执行(不是正式标准)

 1  <script type="text/javascript">
 2     /*
 3       Promise常用API-实例方法
 4     */
 5     // console.dir(Promise);
 6     function foo() {
 7       return new Promise(function(resolve, reject){
 8         setTimeout(function(){
 9           // resolve(123);
10           reject('error');
11         }, 100);
12       })
13     }
14     // 两种写法是等效的
15     foo()
16       .then(function(data){
17         # 得到异步任务正确的结果
18         console.log(data)
19       },function(data){
20         # 获取异常信息
21         console.log(data)
22       })
23       # 成功与否都会执行(不是正式标准) 
24       .finally(function(){
25         console.log('finished')
26       });
27   </script>

 


2.静态方法
1 .all()

Promise.all方法接受一个数组作参数,数组中的对象(p1、p2、p3)均为promise实例(如果不是一个promise,该项会被用Promise.resolve转换为一个promise)。它的状态由这三个promise实例决定
2 .race()

Promise.race方法同样接受一个数组作参数。当p1, p2, p3中有一个实例的状态发生改变(变为fulfilled或rejected),p的状态就跟着改变。并把第一个改变状态的promise的返回值,传给p的回调函数

 1 <script type="text/javascript">
 2     /*
 3       Promise常用API-对象方法
 4     */
 5     // console.dir(Promise)
 6     function queryData(url) {
 7       return new Promise(function(resolve, reject){
 8         var xhr = new XMLHttpRequest();
 9         xhr.onreadystatechange = function(){
10           if(xhr.readyState != 4) return;
11           if(xhr.readyState == 4 && xhr.status == 200) {
12             // 处理正常的情况
13             resolve(xhr.responseText);
14           }else{
15             // 处理异常情况
16             reject('服务器错误');
17           }
18         };
19         xhr.open('get', url);
20         xhr.send(null);
21       });
22     }
23     var p1 = queryData('http://localhost:3000/a1');
24     var p2 = queryData('http://localhost:3000/a2');
25     var p3 = queryData('http://localhost:3000/a3');
26      Promise.all([p1,p2,p3]).then(function(result){
27        //   all 中的参数  [p1,p2,p3]   和 返回的结果一 一对应["HELLO TOM", "HELLO JERRY", "HELLO SPIKE"]
28        console.log(result) //["HELLO TOM", "HELLO JERRY", "HELLO SPIKE"]
29      })
30     Promise.race([p1,p2,p3]).then(function(result){
31       // 由于p1执行较快,Promise的then()将获得结果'P1'。p2,p3仍在继续执行,但执行结果将被丢弃。
32       console.log(result) // "HELLO TOM"
33     })
34   </script>

 

 


————————————————
原文链接:https://blog.csdn.net/qq_50384924/article/details/117521833

posted on 2023-04-18 10:35  watercaltrop  阅读(23)  评论(0编辑  收藏  举报