Написал функцию, которая подключает на страницу файл js и после загрузки этого файла выполняет нужный код (callback):
const loadJS = (src, cb) => {
let script = document.createElement('script');
script.setAttribute('src', src)
document.body.appendChild(script); // формируем тег и вставляем на страницу
script.onload = () => { // после загрузки
if (cb && typeof cb == 'function') {
cb.call(); // выполняем callback
}
}
}
Дальше возникла логичная необходимость проверять - был ли уже загружен файл при предыдущих выполнениях loadJS()?
Не придумал ничего лучше, как записывать все подключенные ранее файлы в массив и искать url в нем:
const loadJS = {
loaded: [],
load(src, cb) {
let _this = this;
if (!_this.loaded.includes(src)) { // если url не найден в массиве загруженных файлов
let script = document.createElement('script');
script.setAttribute('src', src)
document.body.appendChild(script); // формируем тег и вставляем на страницу
script.onload = () => { // после загрузки
_this.loaded.push(src); // добавляем url в массив
if (cb && typeof cb == 'function') {
cb.call(); // выполняем callback
}
}
} else { // если url найдет в массиве загруженных файлов
if (cb && typeof cb == 'function') {
cb.call(); // выполняем callback
}
}
}
}
loadJS.load('https://api-maps.yandex.ru/2.1/?lang=ru_RU', function() {
console.log('Yandex Maps API loaded'); // или какой-то другой код
});
Отрабатывает как мне нужно.
Но насколько это правильный подход?
Может быть, можно сделать более качественную и точную проверку?