Промісіфікацыя асінхроннага кода ў JavaScript
Так як промісы з'явіліся ў JavaScript не так даўно, то некаторы асінхронны функцыянал можа не падтрымліваць промісы. У гэтым выпадку карысна стварыць над такім кодам абалонку ў выглядзе проміса, так як карыстацца промісамі значна зручней. Такое пераўтварэнне называецца промісіфікацыяй.
Прыкладам функцыяналу, які не падтрымлівае промісы, можа служыць загрузка выяў, якую мы ўжо разбіралі ў папярэдніх уроках:
let 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');
});
Давайце выканаем промісіфікацыю гэтага кода, абарваўшы яго ў функцыю, якая вяртае проміс:
function 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'));
});
});
}
Мы зможам скарыстацца нашай функцыяй наступным чынам:
loadImage('img.png').then(function(image) {
document.body.appendChild(image);
}).catch(function(error) {
console.log(error);
});
Самастойна, не падглядаючы ў мой код, выканайце промісіфікацыю загрузкі выяў. Пратэстуйце атрыманы код.
Хай шляхі да выяў захоўваюцца ў масіве:
let paths = ['img1.png', 'img2.png', 'img3.png'];
Напішыце код, які дачакаецца заканчэння загрузкі ўсіх выяў, а затым дадасць іх у цыкле ў канец body.
Дадзены наступны код:
window.addEventListener('DOMContentLoaded', function() {
console.log('dom загружаны');
});
Выканайце яго промісіфікацыю.