wkololo_4ever
@wkololo_4ever

Почему код $.ajax выполняется несколько раз?

Есть такая функция
function GetNewTelephone() {
            var link = 'Home/NewTelephone?idOldTelephone=-1&idContact=-2';
            var number = document.getElementsByClassName("number");
            for (i = 0; i < number.length; i++) {//цикл по всем полям с номерами
                var numberInp = number[i];
                var idNumber = number[i].id;
                var idContact = number[i].parentNode.id;
                link = link.replace("-1", idNumber);
                link = link.replace("-2", idContact);
                $.ajax({
                    type: "GET",
                    url: link,
                    success: function (data) {
                        for (j = 0; j < data.length; j++)//цикл по всем новым номерам
                        {
                            var telephone = data[j];
                            var cont = document.getElementById(telephone.ContactId);
                            var numberInput = cont.cells[2];
                            numberInput.innerText += telephone.Number;
                            numberInput.id = telephone.TelephoneId;
                            
                        }
                    },
            })      
        }
    }

Не понимаю, почему при data.length=1 во втором цикле
for (j = 0; j < data.length; j++){
  ...
}

количество повторов кода внутри цикла равно number.length из первого цикла
for (i = 0; i < number.length; i++){
...
  $.ajax({
...
    for (j = 0; j < data.length; j++){
  ...
}})
}
  • Вопрос задан
  • 4277 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
А чего вы хотите, у вас же функция $.ajax выполняется внутри цикла. Судя по коду она должна быть вне его.

Если же вам нужно вызывать success когда отработает все и что-то делать с результатом всех запросов, то можно сделать так:

var promises = [],
      linkTpl = 'Home/NewTelephone?idOldTelephone=%1&idContact=%2';
      $('.number').each(function () {
             // советую хранить информацию не в id-шниках а в data-* атрибутах
             // их для этого и придумали
             var idNumber = this.id;
             var idContact = this.parentNode.id;
             // вот тут у вас был баг, у вас один раз формировалась
             // правильная ссылка и она больше не менялась.
             var link = linkTpl.replace("%1", idNumber).replace("%2", idContact);
             // добавляем в очередь обещание
             promises.push($.ajax({
                    type: "GET",
                    url: link
             }));
      });
      
      $.when(promises).then(function () {
           // выполнится когда все запросы, добавленные в очередь, выполнятся
           // результаты запроса будут переданы как аргументы, смотрите документацию
      });


https://api.jquery.com/jQuery.when/
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы