Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> jQuery ajax сложная конструкция, ajax внутри функции внутри ajax 
V
    Опции темы
Veroonya
Дата 25.12.2012, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 10.10.2008
Где: Россия, Омск

Репутация: нет
Всего: 1



При покидании окна ввода текста id=autoSign вызывается функция, которая подтягивает данные ajax-ом, связанные с введенным текстом, на базе этих данных выполняется функция, в которой снова вызывается ajax, для получения еще одного набора данных.

Код

$("#autoSign").blur(function() {
    $.ajax({
        url: "${createLink(controller: 'car', action: 'resolveModel')}",
        type: 'Get',
        data: {autoSign: $("#autoSign").val()},
        success: function(data) {
          for (var i = 1; i <= data.сount1; i++) {
                for (var j=1; j<= data.count2; j++){
                var a = rndrTireModel(data.id, 'steer', i, j, 'left');
                ("#result1").val(a);
                a = rndrTireModel(data.id, 'steer', i, j, 'right'); 
                 ("#result2").val(a);
                a = rndrTireModel(data.id, 'lead', i, j, 'left');
                ("#result3").val(a);
                a = rndrTireModel(data.id, 'lead', i, j, 'right');
                 ("#result4").val(a);
             }
          }
       }
    });

function rndrTireModel(carId, shaft, shaftNum, wheel, side) {
     var result;
     $.ajax({
        url: "${createLink(controller: 'tireModel', action: 'resolveTireModel')}",
        type: 'Get',
        data: {car: carId, shaft: shaft, shaftNum: shaftNum, wheel: wheel, side: side},
        success: function(text) {
          result = text;
        }
     });
     alert (result); 
     return result;
}
 });


При добавлении alert (result); данные появляются в итоге там где нужно, при отсутвии alert данные не появляются.
Подумываю, что это как то связано с тем, что когда выполняется второй ajax первый уже завершил свое выполнение.

Подскажите, как реализовать?


Это сообщение отредактировал(а) Aliance - 25.12.2012, 18:13
PM MAIL ICQ   Вверх
Aliance
Дата 25.12.2012, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 7
Всего: 137



Нужно прочитать про замыкания и (а)синхронность запросов в JS. Обычно я кидаю этот линк (особенно раздел "Замыкания внутри циклов"), т.к. там как мне кажется наиболее просто объяснено то, что нужно знать.

Решение:
В rndrTireModel нужно передавать ID элемента, куда нужно вставлять результат, и далее вставлять его после выполнения второго запроса. Примерно это будет выглядеть так:
Код

...
rndrTireModel(data.id, 'steer', i, j, 'left', 'result1');
...
function rndrTireModel(carId, shaft, shaftNum, wheel, side, elemID) {
     $.ajax({
        url: "${createLink(controller: 'tireModel', action: 'resolveTireModel')}",
        type: 'Get',
        data: {car: carId, shaft: shaft, shaftNum: shaftNum, wheel: wheel, side: side},
        success: function(text) {
          ("#"+elemID).val(text);
        }
     });
}
 });

PM MAIL WWW ICQ Skype   Вверх
Veroonya
Дата 25.12.2012, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 10.10.2008
Где: Россия, Омск

Репутация: нет
Всего: 1



Цитата(Aliance @  25.12.2012,  18:16 Найти цитируемый пост)
В rndrTireModel нужно передавать ID элемента, куда нужно вставлять результат


спс, сама не додумалась
PM MAIL ICQ   Вверх
Veroonya
Дата 25.12.2012, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 10.10.2008
Где: Россия, Омск

Репутация: нет
Всего: 1



Цитата(Aliance @  25.12.2012,  18:16 Найти цитируемый пост)
В rndrTireModel нужно передавать ID элемента, куда нужно вставлять результат

Когда так делаешь, дает везде одинаковый результат
PM MAIL ICQ   Вверх
Aliance
Дата 25.12.2012, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 7
Всего: 137



1. В консоле нужно проверить, действительно ли данные должны быть разными.
2. Если п. 1 не помог, то нужно показать весь новый код.
PM MAIL WWW ICQ Skype   Вверх
Veroonya
Дата 25.12.2012, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 10.10.2008
Где: Россия, Омск

Репутация: нет
Всего: 1



В результате действительно должны быть разные значения.
В итоге получается везде результат от последнего вызова функции (которой должен быть в result4);

Код

$("#autoSign").blur(function() {
    $.ajax({
        url: "${createLink(controller: 'car', action: 'resolveModel')}",
        type: 'Get',
        data: {autoSign: $("#autoSign").val()},
        success: function(data) {
          for (var i = 1; i <= data.сount1; i++) {
                for (var j=1; j<= data.count2; j++){
                rndrTireModel('steer', i, j, 'left', '#result1');
                rndrTireModel('steer', i, j, 'right', '#result2'); 
                rndrTireModel('lead', i, j, 'left', '#result3');
                rndrTireModel('lead', i, j, 'right', '#result4');
             }
          }
       }
    });

function rndrTireModel(shaft, shaftNum, wheel, side, elID) {
     $.ajax({
        url: "${createLink(controller: 'tireModel', action: 'resolveTireModel')}",
        type: 'Get',
        data: {car: $("#car").val(), shaft: shaft, shaftNum: shaftNum, wheel: wheel, side: side},
        success: function(text) {
          $(elID).val(text);
        }
     });
 }




Это сообщение отредактировал(а) Aliance - 26.12.2012, 10:32
PM MAIL ICQ   Вверх
Aliance
Дата 26.12.2012, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 7
Всего: 137



Veroonya, выше я приводил линк с указанием раздела, на который нужно обратить внимание. Вы его читали?
Думаю, что для решения проблемы достаточно просто будет создать замыкание.
PM MAIL WWW ICQ Skype   Вверх
Veroonya
Дата 27.12.2012, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 10.10.2008
Где: Россия, Омск

Репутация: нет
Всего: 1



всем спс нашла затуп в коде.
Было обращение к элементу с "."
$("#name.name");
А так делать нельзя
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Применение библиотек | Следующая тема »


 




[ Время генерации скрипта: 0.0720 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.