bmw318mt Ответов: 1

Ajax aysnc запрос в JS


Привет,

Я использую эту функцию, чтобы получить некоторые данные из БД и сохранить результат в классе stripLayout. Однако проблема заключается в том, что во время первого запуска класс остается пустым, поэтому я ввел async: false и решил эту проблему.

Но я читал, что это не правильный способ сделать это, и вместо этого можно использовать "обещание". Я не мог найти способ, который заставляет этот код работать, когда я пытался сделать такое изменение. Кто-нибудь может мне помочь, пожалуйста?

function getStripLayoutsDetails(){
	$.ajax( 'admnStripLayouts_getStripLayoutDetails.php',
	{
		async: false,
		type: 'POST',
		data: {					
			LayoutName: $('#aSL_stripLayoutsList').val()					
		},
		success: function (result) {

		stripLayout = {
			layoutName:result.stripLayoutDetails[0].LayoutName,
			version:result.stripLayoutDetails[0].Version
		};				
							
		if(result.status == "Error"){
			displayError(result.detail, 'Error Retrieving Strip Layout Details', 'critical');
			return;
			}					
		},							
		error: function (resp, status, xhr) {
			displayError('Valid Value lookup request to server failed', 'Lookup Error', 'critical');
		}
	}); 
}


Что я уже пробовал:

Попробовал это изменение, однако оно ведет себя так же, как и при отсутствии асинхронности: false

function getStripLayoutsDetails(){
    $.ajax(
        { url: "/admnStripLayouts_getStripLayoutDetails.php" ,
            type: 'POST',
            data: {
                LayoutName: $('#aSL_stripLayoutsList').val()
            }
    })
    .done(function(getStripLayoutsDetails) {
        stripLayout = {
            layoutName:getStripLayoutsDetails.stripLayoutDetails[0].LayoutName,
            version:getStripLayoutsDetails.stripLayoutDetails[0].Version
    };
}).fail(function(e) {
    displayError('Valid Value lookup request to server failed', 'Lookup Error', 'critical');

    }).always(function() {} );
}

Karthik_Mahalingam

вы не возвращаете никаких данных, так почему же вам нужно использовать async: false,

bmw318mt

Да я получаю результат как объект и храню его в классе

Karthik_Mahalingam

использовать  Ответить  кнопка, чтобы отправить комментарии / запрос пользователю, чтобы пользователь получил уведомление и ответил на ваш текст.

Karthik_Mahalingam

в чем именно заключается проблема?
есть ли проблема с асинхронностью или с чем-то другим?

bmw318mt

У меня есть список, а затем, когда я нажимаю на элемент, я получаю информацию, вызывая эту функцию. При запуске я инициализирую открытый класс, когда я щелкаю элемент в списке, я вызываю эту функцию, которая заполнит класс. Проблема в том, что первый элемент, который я нажимаю на класс, все еще пуст, затем я нажимаю на другой элемент, и класс будет содержать информацию, относящуюся к ранее нажатому элементу.

Karthik_Mahalingam

вы положили debugger и проверил в chrome console ?

1 Ответов

Рейтинг:
1

Richard Deeming

Проблема не в том, что getStripLayoutsDetails функция. Проблема заключается в вызывающей функции.

Вы уже изменили getStripLayoutsDetails функция для использования обещания. Теперь вам нужно вернуть обещание из этой функции и переписать вызывающую функцию аналогичным образом.

Вместо:

getStripLayoutDetails();
// Use stripLayout here...

Ты бы так и сделал:
function getStripLayoutsDetails(){
    return $.ajax(...).done(function(getStripLayoutsDetails) { ... }).fail(function(e) { ... });
}

getStripLayoutsDetails().done(function(){
    // Use the stripLayout here...
});

Обещания[^]
Обещания/A+[^]
Обещания JavaScript ... В Зловещих Деталях-Мэтт Грир[^]
Документация API отложенного объекта | jQuery[^]