资讯专栏INFORMATION COLUMN

Promise加载图片用法详解

Brenner / 603人阅读

摘要:现在不会用都不好意思说自己是前端,为什么火起来,一句话解决了回调嵌套和执行顺序问题最重要的我感觉是解决顺序问题。

现在不会用Promise都不好意思说自己是前端,Promise为什么火起来,一句话解决了回调嵌套和执行顺序问题最重要的我感觉是解决顺序问题。

不过开始写之前我们先看看,promise怎么解决问题,怎么用。
列举一个顺序加载图片demo:

//需求 加载三张图片 img1,img2,img3,加载顺序是1,2,3
        let url1 = "https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=3293635140,3955114282&fm=26&gp=0.jpg"
        let url2 = "https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1019333328,1858047370&fm=26&gp=0.jpg"
        let url3 = "https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=4226468334,723383513&fm=26&gp=0.jpg"
        let oImg1 = new Image()
        oImg1.onload = function() {
            console.log("img1加载完毕")
            let oImg2 = new Image()
            oImg2.onload = function() {
                console.log("img2加载完毕")
                let oImg3 = new Image()
                oImg3.onload = function() {
                    console.log("img3加载完毕")
                    console.log("全部加载完毕")
                }
                oImg3.src = url3
            }
            oImg2.src = url2
        }
        oImg1.src = url1

//结果没毛病

接下来我们试试promise怎么做,

        function loadImg(url) {
            let img = new Image()
            img.src = url
            return new Promise((resolve, reject) => {
                img.onload = () => {
                    console.log(url)
                    resolve()
                }
                img.onerror = (e) => {
                    reject(e)
                }
            })
        }


        loadImg(url1).then(() => {
            return loadImg(url2)
        }).then(() => {
            return loadImg(url3)
        })

接下来再看看Promise.all,

//需求 加载三张图片 img1,img2 全部加载完成做一些事情
        let urls = ["https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=3293635140,3955114282&fm=26&gp=0.jpg",
            "https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1019333328,1858047370&fm=26&gp=0.jpg"
        ]


        function loadImg(url) {
            let img = new Image()
            img.src = url
            return new Promise((resolve, reject) => {
                img.onload = () => {
                    resolve(img)
                }
                img.onerror = (e) => {
                    reject(e)
                }
            })
        }

        function loadAll(arr) {
            let result = []
            arr.forEach(item => {
                let p = loadImg(item).then((img) => {
                        console.log(img)
                    })
                    //存储当前Promise对象
                console.log(p)
                result.push(p)
            });
            Promise.all(result).then(() => {
                //全部完成
                console.log("done")
            }).catch((err) => {
                // 有失败的情况
                console.log(err)
            });
        }
        loadAll(urls)

完成。。。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/101145.html

相关文章

  • 前端面试题总结(js、html、小程序、React、ES6、Vue、算法、全栈热门视频资源)

    摘要:并总结经典面试题集各种算法和插件前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快速搭建项目。 本文是关注微信小程序的开发和面试问题,由基础到困难循序渐进,适合面试和开发小程序。并总结vue React html css js 经典面试题 集各种算法和插件、前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快...

    li21 评论0 收藏0
  • 前端面试题总结(js、html、小程序、React、ES6、Vue、算法、全栈热门视频资源)

    摘要:并总结经典面试题集各种算法和插件前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快速搭建项目。 本文是关注微信小程序的开发和面试问题,由基础到困难循序渐进,适合面试和开发小程序。并总结vue React html css js 经典面试题 集各种算法和插件、前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快...

    AaronYuan 评论0 收藏0
  • 前端文档收集

    摘要:系列种优化页面加载速度的方法随笔分类中个最重要的技术点常用整理网页性能管理详解离线缓存简介系列编写高性能有趣的原生数组函数数据访问性能优化方案实现的大排序算法一怪对象常用方法函数收集数组的操作面向对象和原型继承中关键词的优雅解释浅谈系列 H5系列 10种优化页面加载速度的方法 随笔分类 - HTML5 HTML5中40个最重要的技术点 常用meta整理 网页性能管理详解 HTML5 ...

    jsbintask 评论0 收藏0

发表评论

0条评论

Brenner

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<