Promise

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。Promise提供统一的API,各种异步操作都可以用同样的方法进行处理。

1.ES5回调实现异步

 1 {
 2     let ajax = function(callback){
 3         console.log("执行了")
 4         setTimeout(function(){
 5             callback&&callback.call() ;  //判断callback为真时执行
 6         },1000);
 7     };
 8     ajax(function(){
 9         console.log("setTimeout1")
10     })
11 }

2.Promise实现异步

 1 {
 2     let ajax = function(){   //不需要参数
 3         console.log("执行2");
 4         return new Promise(function(resolve,reject){  //返回Promise对象,具有then方法,resolve要执行下一步的操作,reject表示要终端操作
 5             setTimeout(function(){
 6                 resolve();
 7             },1000)
 8         })
 9     };
10     ajax().then(function(){      //then的第一个函数体代表resolve,第二个函数体代表reject
11         console.log("promise"); 
12     })
13 }

3.很多异步操作

 1 {
 2     // 不断的下一步下一步 异步
 3     let ajax = function(){
 4         console.log('执行3');
 5         return new Promise(function(resolve,reject){
 6             setTimeout(function(){
 7                 resolve()
 8             },1000)
 9         })
10     };
11     ajax().then(function(){
12         return new Promise(function(resolve,reject){
13             setTimeout(function(){
14                 resolve()
15             },1000)
16         })
17     })
18     .then(function(){
19         console.log("setTimeout3")
20     })
21 }

4.捕捉异常catch

 1 {
 2     let ajax = function(num){
 3         return new Promise(function(resolve,reject){
 4             if(num >5){
 5                 resolve()
 6             }else{
 7                 throw new Error("值小于5了")
 8             }
 9         })
10     };
11     ajax(6).then(function(){
12         console.log("log",6)
13     }).catch(function(err){
14         console.log('err',err)
15     })
16 
17     ajax(3).then(function(){
18         console.log("log",3)
19     }).catch(function(err){
20         console.log("err",err)
21     })
22 }

5.Promise.all

 1 {
 2     // 所有图片加载完在添加到页面
 3     function loadImg(src){
 4         return new Promise((resolve,reject)=>{
 5             let img = document.createElement("img");
 6             img.src=src;
 7             img.onload=function(){
 8                 resolve(img);
 9             }
10             img.onerror=function(err){
11                 reject(err);
12             }
13         })
14     }
15 
16     function showImgs(imgs){
17         imgs.forEach(img=>{
18             document.body.appendChild(img);
19         })
20     }
21     Promise.all([    //all把多个Promise实例当做一个Promise实例
22         loadImg('https://oimagec4.ydstatic.com/image?id=-5397300958976572132&product=adpublish&w=520&h=347'),
23         loadImg('https://oimagec4.ydstatic.com/image?id=-5397300958976572132&product=adpublish&w=520&h=347'),
24         loadImg('https://oimagec4.ydstatic.com/image?id=-5397300958976572132&product=adpublish&w=520&h=347')
25         ])
26     .then(showImgs)   //当所有图片都加载完成后才触发新的Promise实例
27 }

6.Promise.race

 1 {
 2     //有一个图片加载完成就添加到页面上,其他的不管
 3     function loadImg(src){
 4         return new Promise((resolve,reject)=>{
 5             let img = document.createElement("img");
 6             img.src=src;
 7             img.onload=function(){
 8                 resolve(img);
 9             }
10             img.onerror=function(err){
11                 reject(err);
12             }
13         })
14     }
15     function showImg(img){
16         let p = document.createElement('p');
17         p.appendChild(img);
18         document.body.appendChild(p);
19     }
20     Promise.race([    //只加载一个
21         loadImg('https://oimagec4.ydstatic.com/image?id=-5397300958976572132&product=adpublish&w=520&h=347'),
22         loadImg('https://oimagec4.ydstatic.com/image?id=-5397300958976572132&product=adpublish&w=520&h=347'),
23         loadImg('https://oimagec4.ydstatic.com/image?id=-5397300958976572132&product=adpublish&w=520&h=347')
24         ])
25     .then(showImg) 
26 }
posted @ 2019-12-19 10:20  木汐a  阅读(1110)  评论(0编辑  收藏  举报