Страницы

Поиск по вопросам

вторник, 24 декабря 2019 г.

ассинхронная загрузка

#javascript #jquery #ajax


у меня есть страница последовательной загрузки скриптов  за генерацию нужной страницы
отвечают несколько скриптов 
сейчас есть проблема с прогрузкой страницы -точнее она работает через раз , то загружается
весь контент, то нет! 

..код из этого файла (ниже). 

var pageLoaded = false;  // переменная, означающая, что все скрипты на странице были
загружены (используется в header.js)

$(document).ready(function() {
    $.getScript('js/check-authorization.js', function() {
        $('#header').load('html/header.html', function() {
            $('#footer').load('html/footer.html', function() {
                $.getScript('js/functions/convertJsonToHtmlTreeForBspiAndIkz35.js',
function() {
                    $.getScript('locales/translate.js', function() {
                        $.getScript('js/header.js', function() {
                            $.getScript('js/functions/transofm-into-devices.js',
function() {
                                $.getScript('js/functions/transform-firmware_version.js',
function() {
                                    $.getScript('js/settings-for-device.js', function() {
                                        $.getScript('js/settings-for-device-part2.js',
function() {  // необходим для последовательной загрузки выполнения асинхронных действий
                                            $.getScript('js/functions/switch-between-devices.js',
function() {
                                                if ( window.engineerAnthrax == true ) {
                                                    $.getScript('js/functions/send-firmware-version.js',
function() {
                                                        $.getScript('js/functions/send-firmware-version-stm.js',
function() {
                                                            changeLanguage();

                                                            pageLoaded = true;
                                                        });
                                                    });
                                                } else {
                                                    changeLanguage();

                                                    pageLoaded = true;
                                                }
                                            });
                                        });
                                    });
                                });
                            });
                        });
                    });
                });
            });
        });


В файле settings-for-device-part2.js есть код сет тайм аут 

if (    
    ( deviceDeviceType == 1584 ) ||  // ИКЗ-35
    ( deviceDeviceType == 1588 ) ||  // ИКЗ-31Л
    ( deviceDeviceType == 1589 ) ||  // ИКЗ-33Л
    ( deviceDeviceType == 1591 )     // ИКЗ-32Л
) {
    var timerHideTriggers = setInterval(function() {
        if (  // проверяем существуют ли элементы
            ( $('#th-ptg-in-network').length )
        ) {
            clearInterval(timerHideTriggers);

            // - ОЗЗ в сети
            $('#th-ptg-in-network').css('display', 'none'); 
            $('#EventsTypesSaveRecord-check9').parent().css('display', 'none');
            $('#EventsTypesReportAsFail-check9').parent().css('display', 'none');
        }
    }, 100);

    setTimeout(function() {
        clearInterval(timerHideTriggers);
    }, 1000);
}


Вопрос в том, что задержка используется для корректной подгрузки файлов локализации.
но т.к контент динамический -все продолжает ломаться на других данных.Как пофиксить это ?
    


Ответы

Ответ 1



Я бы промисифицировал эти функции и использовал Promise.all чтобы дождаться, когда загрузятся все. Примерно так: // Предположим, что fn требует callback последним аргументом function promisify(fn) { return function(...args) { return new Promise((resolve) => fn.bind(this)(...args, resolve)); } } $(function() { $.getScript = promisify($.getScript); $.fn.load = promisify($.fn.load); // Могу ошибаться, но надеюсь, что сработает Promise.all([ // Первая порция $.getScript('js/1.js'), $.getScript('js/2.js'), $.getScript('js/3.js'), $('#header').load('html/header.html'), ]).then(() => Promise.all([ // вторая порция $.getScript('js/dep_1.js'), $.getScript('js/dep_2.js'), ])).then(() => $.getScript('js/another.js')) // Ещё скрипт после второй порции .then(() => { changeLanguage(); console.log('Loaded'); }) }) Plunkr () => {}: Стрелочные функции ...args: Rest-оператор(остальные аргументы) и Spread синтаксис Promise Promise.all bind

Комментариев нет:

Отправить комментарий