2015-03-10 8 views
0

Я использую запросы Ajax через JQuery для обновления некоторых частей веб-страницы.Обработка ответа Ajax прерывается при вложении другого запроса Ajax

В зависимости от значений данных, полученных из первого запроса Ajax, я посылаю (или нет) другой вложенный запрос Ajax, чтобы получить дополнительную информацию. Значение второго запроса Ajax вложен в первый обработчик ответа Ajax. не

В основном:

// Get some information 
$.ajax({type: "POST", url: get_some_info_url}) 
    .done(
    function(msg) 
    { 
     // Given the info contained in msg, let send another request to get more 
     if(msg.some_info === true) 
     { 
     $.ajax({type: "POST", url: get_some_more_info_url}) 
      .done(
       function(msg2) 
       { 
        // Do something 
       }); 
     } 

     // Display "Hello world!" whatever the msg.some_info value is. 
     $('div#message-id').html("Hello world!"); 

    }); 

Различные сценарии: "Привет, мир!"

  1. Если msg.some_info является ИСТИНА =>нет отображения из

  2. Если msg.some_info - FALSE =>, отображающий из "Hello world!"

  3. Более странно: если я поставил точку останова в отладчике Firefox на строку, содержащую второй вложенный вызов Ajax (только переступив через вызов $ .ajax в отладчике) и msg.some_info ИСТИНА =>отображения «Привет, мир!»

Я немного смущен здесь. Почему мой второй вызов Ajax предотвращает выполнение остальной части кода первого ответа Ajax? Есть ли какое-то «состояние гонки» или материал для управления сеансом?

И почему нарушение кода «разрешает» проблему?

EDIT: ВОПРОС РЕШЕН. См. Мой ответ.

Благодарим за помощь.

+0

Только возможная причина - ошибка JS в вашем вложенном вызове ajax, останавливающем запуск JS-движка. – RaviH

+0

На несвязанной ноте вы можете использовать [Promise] (http://blog.kevinchisholm.com/javascript/jquery/using-the-jquery-promise-interface-to-avoid-the-ajax-pyramid- of-doom /) в jQuery, чтобы ваш код был чистым. – bzlm

+1

Вы уже определили «ИСТИН»? В синтаксисе javascript не существует 'TRUE', логические значения -' true' и 'false'. Попробуйте написать просто 'if (msg.some_info)'. Чтобы понять, как читать правдивые и ложные выражения в js –

ответ

0

Я не уверен, что вы должны проверить истину с помощью оператора ===.

В соответствии с вашими комментариями,

// Given the info contained in msg, let send another request to get more 

вы просто хотите проверить, если

msg.some_info 

существует вообще. В этом случае лучше, чтобы проверить, написав

if(msg.some_info) { 
    /* Your code here*/ 
} 

Другой вариант, почему msg.some_info верно, но «Привет мир» не отображается в том, что ваш код не ответ от сервера и ждет его. Поскольку вы написали «просто перешагнули вызов $ .ajax в отладчике), а msg.some_info - TRUE => отображение« Hello world! »». Таким образом, вы перешагиваете эту «плохую точку», и сообщение делится, чем. Это заставляет меня думать, что есть некоторые проблемы либо в самом коде, либо в ответе сервера, который не вернулся.

+0

Спасибо за помощь. Я нашел проблему. Я собираюсь написать ответ. Это была моя ошибка. Я объясню. Для информации я не тестирую boolean === true, но сделал это здесь, чтобы сделать код более понятным. – Nitseg

0

Вопрос был на моей стороне, извините за то, что тратил ваше время.

На самом деле я стирал «мир привет!». текст во второй обработке ответа Ajax. Следовательно, разница между прогоном отладки и обычным прогоном.Последовательность обработки ответов ajax не была одинаковой с отладкой и без нее, что вводило меня в заблуждение относительно основной причины проблемы.

Благодарим всех вас за помощь.

Смежные вопросы