Promisificação de código assíncrono em JavaScript

Como as promessas surgiram no JavaScript há pouco tempo, algumas funcionalidades assíncronas podem não suportar promessas. Nesse caso, é útil criar um wrapper em torno desse código na forma de uma promessa, pois usar promessas é muito mais conveniente. Essa transformação é chamada de promisificação.

Um exemplo de funcionalidade que não suporta promessas pode ser o carregamento de imagens, que já analisamos em lições anteriores:

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

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

Vamos realizar a promisificação deste código, encapsulando-o em uma função que retorna uma promessa:

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('image "' + path + '"  load error'));
    });
  });
}

Poderemos usar nossa função da seguinte maneira:

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

Por conta própria, sem espiar o meu código, realize a promisificação do carregamento de imagens. Teste o código obtido.

Задание 2

Suponha que os caminhos das imagens estejam armazenados em um array:

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

Escreva um código que aguardará o término do carregamento de todas as imagens e, em seguida, as adicionará em um loop ao final do body.

Задание 3

Dado o seguinte código:

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

Realize sua promisificação.