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預載時間公布,但丁攜大侄子等你來玩