當前位置:
首頁 > 知識 > Promise實現多圖預載入

Promise實現多圖預載入

Promise正如它的中文意思「承諾」一樣,保存著未來會發生事件(一般為非同步操作)。Promise避免了「回調地獄」,寫法更加接近同步操作。說到同步,我更加喜歡async、await,它們書寫更貼近同步操作。

圖片載入往往是非同步的,如果有操作需要等到所有的圖片載入完之後再執行,這時候就需要不斷的監聽所有圖片的載入情況。

ES5

利用ES5實現多圖預載入,可以通過計數器判斷有多少圖片載入完成。

var count = 0, // 計數器
imgs = ;

/*
* (Array)source 圖片url
* (Fun)cb 回調
*/ function preLoadImg(source, cb) { source.forEach(function(url, i) { imgs[i] = new Image; imgs[i].onload = function { if(++count === source.length) { cb && cb; } } imgs.src = url; }) }

ES6

ES6原生提供了Promise對象,接下來用Promise改寫上面的代碼。

// 預處理圖片
function preLoadImg(source){
let pr = ;
source.forEach(url => {// 預載入圖片
let p = loadImage(url)
.then(img => this.images.push(img))
.catch(err => console.log(err))
pr.push(p);
})

// 圖片全部載入完
Promise.all(pr)
.then( => {
// do sth
});

}
// 預載入圖片
function loadImage(url) {
return new Promise((resolve, reject) => {
let img = new Image;
img.onload = => resolve(img);
img.onerror = reject;
img.src = url;
})
}

Promise實際上是將回調操作獨立出來,當Promise狀態從pending(進行中)改為resolved(已完成),then註冊的函數就會被執行,如果狀態從pending改為rejected(已失敗),就會被catch捕獲。

這裡想Promise.all傳入了一個Promise數組,數組中的Promise狀態均為resolved,Promise.all的狀態才會是resolved,否則Promise.all的狀態為rejected。也就是說,當所有圖片載入完成後,才會執行then中的函數。為了防止有圖片載入失敗,阻塞後續操作,為每一個p添加catch,捕獲reject,Primise.all就接受不到了。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

canvas——路徑搜索
使用Go語言來理解Tensorflow
Scrapy教程——豆瓣電影圖片爬取
Linux centos 7 搭建 Javaweb 伺服器
WebService入門實例教程

TAG:科技優家 |

您可能感興趣

微軟宣布:Xbox Game Pass現已支持遊戲預載
Xbox Game Pass已支持新遊戲提前預載
美國微軟商城上架三星Galaxy S9系列:預載微軟Launcher及應用程序
EPIC創始人Tim Sweeney:無主之地3在EGS上將不會有預載
Steam版《鬼泣5》已開啟預載
《鬼泣5》XboxOne版突然更新近30GB 提前預載?
預載開啟 Switch新作《星神鏈》佔用空間為9.6G
《雙點醫院》Steam開啟預載:容量1.5GB
《輻射76》B.E.T.A.測試時段公布 Xbox One預載已開啟
Xbox One《鬼泣5》開啟預載 大小約為30G
《極限競速:地平線4》開啟預載 Xbox One版近63GB
Switch《黑暗之魂 重製版》測試時間公布 預載已開啟
射擊遊戲也能做好劇情Switch版《靈鳥戰機:爆裂》開啟預載
《刺客信條:奧德賽》Xboxone版預載開啟 體積大小為45G
Epic CEO確認PC版《無主之地3》將無法在發售前預載
WeGame《星際戰績》開啟預載 近期開放登錄
《古墓麗影:暗影》Steam預載開啟 3DM預購省140元
《戰爭機器5》開啟預載並放出配置需求:最低系統要求Windows 10 1903
測試MIUI10的AI預載入功能!另外小米6X也將加入!
《鬼泣 5》Steam預載時間公布,但丁攜大侄子等你來玩