JSFiddle - React, Tailwind, and code Playground

by ruirui

HTML

<div id="image-list">
</div>

CSS

img {
  display: block;
  margin-top: 10px;
}

JavaScript

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

function addToHtml(img) {
  var imageList = document.getElementById('image-list');
  imageList.appendChild(img);
}
var urls = ['http://season.jpanj.com/001.jpg', 'http://season.jpanj.com/002.jpg', 'http://season.jpanj.com/003.jpg', 'http://season.jpanj.com/004.jpg', 'http://season.jpanj.com/005.jpg', 'http://season.jpanj.com/006.jpg', 'http://season.jpanj.com/007.jpg', 'http://season.jpanj.com/008.jpg', 'http://season.jpanj.com/009.jpg', 'http://season.jpanj.com/010.jpg', 'http://season.jpanj.com/011.jpg', 'http://season.jpanj.com/012.jpg', 'http://season.jpanj.com/013.jpg', 'http://season.jpanj.com/014.jpg', 'http://season.jpanj.com/015.jpg', 'http://season.jpanj.com/016.jpg',
'http://season.jpanj.com/017.jpg', 'http://season.jpanj.com/018.jpg', 'http://season.jpanj.com/019.jpg', 'http://season.jpanj.com/020.jpg', 'http://season.jpanj.com/021.jpg'];


let queues = [];
let max = 2;
let count = 0;

function load(url) {
  var p = new Promise(function(resolve, reject) {
    queues.push({
      url: url,
      resolve: resolve,
      reject: reject
    });
    loop();
  });
  return p;
}

function loop() {
  let item;
  while (count <= max && (item = queues.shift())) {
    handleImage(item);
  }
}

function handleImage(item) {
  let url = item.url,
    resolve = item.resolve,
    reject = item.reject;
    count = count + 1;
  loadImg(url).then((image) => {
    resolve(image);
    count -= 1;
    loop();
  }).catch((e) => {
    reject(e);
    count -= 1;
    loop();
  });
}
// 调用方法:
urls.forEach(url => load(url).then(addToHtml))