promise的出现主要是在异步操作中带来很大的便利
es5中的传统ajax
{ // 基本定义 let ajax=function(callback){ console.log('执行'); setTimeout(function () { callback&&callback.call() }, 1000); }; ajax(function(){ console.log('timeout1'); }) }
通过promise来实现上面的情况
{ let ajax=function(){ console.log('执行2'); return new Promise(function(resolve,reject){//resolve是成功之后执行的方法 reject是失败的时候执行的方法 setTimeout(function () { resolve() }, 1000); }) }; ajax().then(function(){//通过then来捕捉 成功和失败的时候执行的方法 console.log('promise','timeout2'); }) }
{ let ajax=function(){ console.log('执行3'); return new Promise(function(resolve,reject){ setTimeout(function () { resolve() }, 1000); }) }; ajax() .then(function(){ return new Promise(function(resolve,reject){ setTimeout(function () { resolve() }, 2000); }); }) .then(function(){ console.log('timeout3'); }) }
出错捕获异常(通过catch捕获出错的信息)
{ let ajax=function(num){ console.log('执行4'); return new Promise(function(resolve,reject){ if(num>5){ resolve() }else{ throw new Error('出错了') } }) } ajax(6).then(function(){ console.log('log',6); }).catch(function(err){ console.log('catch',err); }); ajax(3).then(function(){ console.log('log',3); }).catch(function(err){ console.log('catch',err); }); }
promise两种使用场景 (promise.all()当所有的promise实例都resolve之后 才会触发promise.all(),才会有then方法 promise.race()不同的是只要该数组中的 Promise 对象的状态发生变化(无论是 resolve 还是 reject)该方法都会返回)
{ // 所有图片加载完再添加到页面 function loadImg(src){ return new Promise((resolve,reject)=>{ let img=document.createElement('img'); img.src=src; img.onload=function(){ resolve(img); } img.onerror=function(err){ reject(err); } }) } function showImgs(imgs){ imgs.forEach(function(img){ document.body.appendChild(img); }) } Promise.all([ loadImg('http://i4.buimg.com/567571/df1ef0720bea6832.png'), loadImg('http://i4.buimg.com/567751/2b07ee25b08930ba.png'), loadImg('http://i2.muimg.com/567751/5eb8190d6b2a1c9c.png') ]).then(showImgs) }
{ // 有一个图片加载完就添加到页面 function loadImg(src){ return new Promise((resolve,reject)=>{ let img=document.createElement('img'); img.src=src; img.onload=function(){ resolve(img); } img.onerror=function(err){ reject(err); } }) } function showImgs(img){ let p=document.createElement('p'); p.appendChild(img); document.body.appendChild(p) } Promise.race([ loadImg('http://i4.buimg.com/567571/df1ef0720bea6832.png'), loadImg('http://i4.buimg.com/567751/2b07ee25b08930ba.png'), loadImg('http://i2.muimg.com/567751/5eb8190d6b2a1c9c.png') ]).then(showImgs) }