zoukankan      html  css  js  c++  java
  • 图片异步加载的几种实现方案

    一. 异步串行加载

    要求图片依次加载(上一张加载完成,再加载下一张)

    const imgs = [url1, url2, url3,...];

    1. ES5--递归方法

    function loadImage() {
      const image = new Image();
      const itemUrlImage = imgs.shift();
      if (itemUrlImage) {
        image.src = itemUrlImage;  
        image.onload = function() {
          document.body.appendChild(image);
          loadImage();
        }
      }   
    }
    loadImage(); 

    2. ES6--Promise对象

     function loadByPromise() {
      let promise = function(url) {
        return new Promise((resolve, reject) => {
          const image = new Image();
          image.src = url;
          image.onload = function() {
            document.body.appendChild(image);
            resolve('ok');
          }        
        })      
      }
      let p = Promise.resolve();
      for(let url of imgs) {
        p = p.then(() => promise(url))
      }
      p.catch(() => {}).then(() => {
        console.log("加载完成");
      })
    }
    loadByPromise();

    3.ES6--async函数

    async function loadAsync() {
      let promise = function(url) {
        return new Promise((resolve, reject) => {
          const image = new Image();
          image.src = url;
          image.onload = function() {
            document.body.appendChild(image);
            resolve('ok');
          }        
        })      
      }
      for(let url of imgs) {
        await promise(url);
      }
    }
    loadAsync();

     二. 异步并行加载

    要求图片并行加载,全部加载完成后,再插入DOM。

    const imgs = [url1, url2, url3,...];

    1. async函数

    async function loadAsync() {
      let promise = function(url) {
        return new Promise((resolve, reject) => {
          const image = new Image();
          image.src = url;
          image.onload = function() {
            resolve(image);
          }        
        })      
      }
      const promises = imgs.map(i => promise(i)); //实现并行加载
      let results = [];
      for(let promise of promises) {
        results.push(await promise);  //等待加载完成
      }
      results.forEach(image => {
        document.body.appendChild(image);
      })
    }
    loadAsync();

    2.async函数+Promise.all

     async function loadAsync() {
      let promise = function(url) {
        return new Promise((resolve, reject) => {
          const image = new Image();
          image.src = url;
          image.onload = function() {
            resolve(image);
          }        
        })      
      }
      const promises = imgs.map(i => promise(i)); //实现并行加载
      const results = await Promise.all(promises);
      results.forEach(image => {
        document.body.appendChild(image)
      });
    }
    loadAsync();
  • 相关阅读:
    (原创)sqlite封装库SmartDB1.3发布
    合索引 与 单一列的索引
    Sql中CHARINDEX用法
    Eclipse 的快捷键以及文档注释、多行注释的快捷键
    JAVA 方法或者类的注释快捷键
    关于/r与/n 以及 /r/n 的区别总结
    c#中Split 分离字符以及空格消除方法
    C#生成Guid的几种方式
    MVC ViewBag和ViewData的使用
    软考之高级系统架构设计师(包含历年真题详解+课本教程+论文范文+视频教程)
  • 原文地址:https://www.cnblogs.com/lyraLee/p/11806663.html
Copyright © 2011-2022 走看看