@Urukhayy

Как обойти данную «загвоздку» синтаксиса?

Мне надо чтобы в success выводило все числа, которые проходит id, но там только 11. Как решить эту проблему?

for(var id = 1; id != 10; id++)
{
	$.ajax({
		type: "POST",
		data: {Id: id},
		url: "getname.php",
		dataType: "json",
		success: function(data){	
			alert(id); // всегда 11, а надо чтобы было (1,2,3,4...10)
		}
	})
	alert(id); // как надо (1,2,3,4...10)
}
  • Вопрос задан
  • 2391 просмотр
Решения вопроса 2
hell0w0rd
@hell0w0rd
Просто разработчик
var createSuccessHandler = function (i) {
    return function (data) {
        alert(i);
    };  
};
for(var id = 1; id != 10; id++)
{
    $.ajax({
        type: "POST",
        data: {Id: id},
        url: "getname.php",
        dataType: "json",
        success: createSuccessHandler(i)
    })
}

По мотивам habrahabr.ru/company/mailru/blog/233553/, 6 пункт
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
async: false, но лучше так не делать.

Вообще разберитесь может почему так выходит? МОжет потом вы поймете что это никакого отношения к синтаксису не имеет... Что функции в succsess отрабатывают когда цикл уже обошли давно... И лучше делать тогда уж так:
var ids = []
for(var id = 1; id < 10; id++) {
    ids.push(id);
}

ids.forEach(function (id) {
    // по скольку ссылка на нужный id будет сохранена всегда, пока живо замыкание
    // все будет ок.
    $.ajax({
		type: "POST",
		data: {Id: id},
		url: "getname.php",
		dataType: "json",
		success: function(data){	
			alert(id);
		}
	})
}


Что бы лучше понять эту "странность" почитайте про то, как работает js. В частности про event loop
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Проблема в том, что аякс-запрос - асинхронная функция и цикл for просто не ждет ее выполнения. В итоге запрос выполняется с последним значением переменной.

Вот так можно попробовать:

for (var id = 1; id < 11; id++) { 
  (function (id) {
    $.post('getname.php', {Id: id}, function() {	
      alert(id);
    }, 'json');
  })(id)
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы