博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Promise实现多图预加载
阅读量:7222 次
发布时间:2019-06-29

本文共 1819 字,大约阅读时间需要 6 分钟。

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传入了一个数组(可以不是数组,具有iterator接口对象均可以,但返回的成员都必须是Promise实例,如果不是Promise实例,也会调用Promise.resolve转化为Promise实例),数组中的Promise状态均为resolved,Promise.all的状态才会是resolved,否则Promise.all的状态为rejected。也就是说,当所有图片加载完成后,才会执行then中的函数。

但是,如果参数中的Promise实例自己有定义catch方法,那么当rejected的时候,就会被自己的catch捕获,catch方法执行完后,是会返回一个新的,状态为resolve的Promise实例,因此,传给Promise.all的是这个新的,状态为resolve的Promise。为了防止有图片加载失败,阻塞后续操作,为每一个p添加catch,捕获reject,Primise.all就接受不到了。

 

转载于:https://www.cnblogs.com/xxhuan/p/6974181.html

你可能感兴趣的文章
我的友情链接
查看>>
tbox中vector容器的使用
查看>>
一个简单的PHP笔试题
查看>>
firebug重新载入页面获取源码
查看>>
我的友情链接
查看>>
5月末周中国.COM总量净增1.2万个 美国净减2.6万个
查看>>
Elasticsearch数据建模-关联查询
查看>>
我的友情链接
查看>>
CentOS 下安装 Lnmp
查看>>
redis系列:通过日志案例学习string命令
查看>>
世界冠军之路:菜鸟车辆路径规划求解引擎研发历程
查看>>
Linux-sendmail
查看>>
关于BSTR的困惑
查看>>
什么时候使用HashMap?它有什么特点?
查看>>
框架名
查看>>
编译安装PHP
查看>>
插入透明背景Flash的HTML代码
查看>>
无标题
查看>>
我的友情链接
查看>>
Web前端入门学习(3)——CSS选择器
查看>>