所谓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 }