У меня есть приложение, которое создает 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");
});
}