Как создать массив функций отложенного объекта для замены ajax в каждом цикле jquery - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть приложение, которое создает HTML-письма.Если электронная почта существует на определенную дату, функция извлекает данные раздела электронной почты из базы данных в массив.Каждая функция затем проходит по массиву и, в зависимости от типа раздела, запускает отдельную функцию (например, getThemeRow(), getClassSection(), getTastingsSection()), которая вызывает ajax-запрос для извлечения данных раздела, а затем создает HTML дляэтот раздел.Единственный способ получить разделы электронной почты, которые будут созданы в порядке исходного массива sectionarray, - это установить для каждого из этих запросов AJAX, которые запускаются в каждом цикле, значение «async: false».Из поиска лучшего решения здесь я знаю, что это неправильный путь, но я не могу найти лучшего решения для этой конкретной проблемы.

Я думаю, что, возможно, я хочудинамически создавать отложенные объектные функции, которые запускают эти вторичные функции с помощью вызовов AJAX, но я не уверен, как их настроить.

var getEmailSections = function(callback) {
    var store = $('input[name=store]:checked').val();
    var emaildate = '';
    var emaildate = $('#emaildate').val();
    var data = "store="+store+"&emaildate="+emaildate;
    var getSectionsAjax = $.ajax({
        type: "POST",
        url: "get_email_sections.php",
        data: data,
        dataType: "json",
        cache: false
    });
    getSectionsAjax.done(function(sections) {
        var sectionsarray = [];
        sectionsarray.length = 0;
        for (var i=0, len=sections.length, tmp; i<len; i++) {
          tmp = [];
          for (var k in sections[i]) {
            if (sections[i].hasOwnProperty(k)) {
              tmp.push(sections[i][k]);
            }
          }
          sectionsarray.push(tmp);
        }
        console.log(sectionsarray);

        if((sections == undefined) || (sections == '')) {
            getThemeList();
            $('#mailchimpid').val('');
            $('#campaignsubject').val('');
            $('#campaignpreviewtext').val('');
        } else {
            var sectionscount = sections.length;
            console.log(sectionscount);
            $('#themelist').empty();
            $('#mailchimpid').val('');
            $('#campaignsubject').val('');
            $('#campaignpreviewtext').val('');
            getThemeList();
            $('#rightpreview #contentdivwrapper').html('');
            console.log(sections);
            var i=0;
            var mailchimpid = sections[0].mailchimpid;
            var emailsubject = sections[0].emailsubject;
            var emailpreviewtext = sections[0].emailpreviewtext;
            $('#campaignsubject').val(emailsubject).trigger('change');
            $('#campaignpreviewtext').val(emailpreviewtext).trigger('change');
            $('#mailchimpid').val(mailchimpid);

            $.each(sectionsarray, function(i, sectiondiv) {
                var sectiontype = sectiondiv[3];

                var sectionid = sectiondiv[4];
                var sectionsortorder = sectiondiv[5];
                if(sectiontype == 'theme') {
                    console.log(sectionid);
                    // The function below calls an AJAX request to get theme data and HTML
                    getThemeRow(sectionid, sectionsortorder, 'dbsections', function() {
                        console.log('theme #'+sectionid+' added to the email.');
                    });
                } else if(sectiontype == 'classes') {
                    console.log(sectionid);
                    // The function below calls an AJAX request to get class data and HTML
                    getClassSection(sectionid, sectionsortorder, function (response) {
                        console.log('Class section successfully added.');
                    })
                } else if(sectiontype == 'tastings') {
                    console.log(sectionid);
                    // The function below calls an AJAX request to get tasting data and HTML
                    getTastingsSection(sectionid, sectionsortorder, function (response) {
                        console.log('Tastings section successfully added.');
                    })
                }
            });
        }
    });
    getSectionsAjax.fail(function(xhr, textStatus, errorThrown ){
        console.log(errorThrown);
        console.log(textStatus);
        console.warn(xhr.responseText);
        console.log("There is an error with Getting Sections");
    });    
}
...