Asynkronisen koodin promisifiointi JavaScriptissä

Koska promiset eivät ole olleet JavaScriptissä kovin kauan, jotkut asynkroniset toiminnot eivät välttämättä tue promiseja. Tällöin on hyödyllistä luoda kyseiselle koodille promise-kääre, sillä promiseilla on paljon mukavampaa käyttää. Tällaista muunnosta kutsutaan promisifioinniksi.

Esimerkkinä toiminnosta, joka ei tue promiseja, voi olla kuvien lataus, jota olemme jo käsitelleet aikaisemmissa oppitunneissa:

javascriptlet image = document.createElement('img');
image.src = 'img.png';

image.addEventListener('load', function() {
  document.body.appendChild(image);
});
image.addEventListener('error', function() {
  console.log('kuvan latausvirhe');
});

Suoritetaan tämän koodin promisifiointi käärimällä se funktioon, joka palauttaa promisen:

javascriptfunction loadImage(path) {
  return new Promise(function(resolve, reject) {
    let image = document.createElement('img');
    image.src = path;
    
    image.addEventListener('load', function() {
      resolve(image);
    });
    image.addEventListener('error', function() {
      reject(new Error('kuvan "' + path + '" latausvirhe'));
    });
  });
}

Voimme käyttää funktiotamme seuraavalla tavalla:

javascriptloadImage('img.png').then(function(image) {
  document.body.appendChild(image);
}).catch(function(error) {
  console.log(error);
});
Задание 1

Suorita itsenäisesti, katsomatta koodiini, kuvien latauksen promisifiointi. Testaa saatua koodia.

Задание 2

Oletetaan, että kuvien polut tallennetaan taulukkoon:

javascriptlet paths = ['img1.png', 'img2.png', 'img3.png'];

Kirjoita koodi, joka odottaa kaikkien kuvien latautumisen loppumista ja sitten lisää ne silmukassa bodyn loppuun.

Задание 3

Annettu seuraava koodi:

javascriptwindow.addEventListener('DOMContentLoaded', function() {
  console.log('dom ladattu');
});

Suorita sen promisifiointi.