Promise正如它的中文意思“承諾”一樣,保存著未來(lái)會(huì)發(fā)生事件(一般為異步操作)。Promise避免了“回調(diào)地獄”,寫(xiě)法更加接近同步操作。說(shuō)到同步,我更加喜歡async、await,它們書(shū)寫(xiě)更貼近同步操作。
圖片加載往往是異步的,如果有操作需要等到所有的圖片加載完之后再執(zhí)行,這時(shí)候就需要不斷的監(jiān)聽(tīng)所有圖片的加載情況。
ES5
利用ES5實(shí)現(xiàn)多圖預(yù)加載,可以通過(guò)計(jì)數(shù)器判斷有多少圖片加載完成。
count = 0, imgs == = (++&&=
ES6
ES6原生提供了Promise對(duì)象,接下來(lái)用Promise改寫(xiě)上面的代碼。
// 預(yù)處理圖片 function preLoadImg(source){ let pr = []; source.forEach(url => {// 預(yù)加載圖片 let p = loadImage(url) .then(img => this.images.push(img)) .catch(err => console.log(err)) pr.push(p); }) // 圖片全部加載完 Promise.all(pr) .then(() => { // do sth }); } // 預(yù)加載圖片 function loadImage(url) { return new Promise((resolve, reject) => { let img = new Image(); img.onload = () => resolve(img); img.onerror = reject; img.src = url; }) }
Promise實(shí)際上是將回調(diào)操作獨(dú)立出來(lái),當(dāng)Promise狀態(tài)從pending(進(jìn)行中)改為resolved(已完成),then注冊(cè)的函數(shù)就會(huì)被執(zhí)行,如果狀態(tài)從pending改為rejected(已失?。?,就會(huì)被catch捕獲。
這里想Promise.all傳入了一個(gè)Promise數(shù)組,數(shù)組中的Promise狀態(tài)均為resolved,Promise.all的狀態(tài)才會(huì)是resolved,否則Promise.all的狀態(tài)為rejected。也就是說(shuō),當(dāng)所有圖片加載完成后,才會(huì)執(zhí)行then中的函數(shù)。為了防止有圖片加載失敗,阻塞后續(xù)操作,為每一個(gè)p添加catch,捕獲reject,Primise.all就接受不到了。
http://www.cnblogs.com/xxhuan/p/6974181.html