JQuery getJSon вложенные вызовы не работают - PullRequest
3 голосов
/ 20 января 2011

Мне нужно выполнить два AJAX-вызова через функцию JQuery getJSON.

Дело в том, что после выполнения одного из вызовов мне нужно немедленно вызвать вторую функцию getJSON (посколькурезультат первого вызова в качестве параметра во втором вызове).

Мой код выглядит следующим образом:

$.getJSON("/Traslados/ObtenerCedulas", { Param1: $("#Param1").val(), Param2: $("#Param2").val() }, function (j) {
      $("#Result1").val(j); 
      $.getJSON("/Traslados/ObtenerLogins", { Param3: $("#Param3").val(), Param4: $("#Result1").val() },  
                function (k) {
                        alert(k);
                        $("#Result2").val(k);
       });
 });

Проблема в том, что второй вызов выполняется правильно иучитывая ожидаемый результат (я отлаживал его с помощью консоли Firebug), он не вызывает предупреждение и, что еще хуже, не устанавливает значение k для моего поля ввода Result2.

Что происходит?1014 *

1 Ответ

0 голосов
/ 28 сентября 2013

Одна проблема, которую я вижу здесь, заключается в том, что ваш второй вызов getJSON происходит независимо от того, был ли первый вызов успешным или неудачным, и из кода, который вы опубликовали, нет способа узнать, был ли # Result1 установлен правильно.

Если вы посмотрите документацию по API getJSON: http://api.jquery.com/jQuery.getJSON/ Он покажет вам, как структурировать ваш первый getJSON так, чтобы у вас были некоторые обработанные ответы типа "сделано / не выполнено / всегда".

Если память не изменяет, это не вся ваша проблема. Когда мне нужно было выполнять ajax-вызовы, которые должны происходить по порядку, в прошлом я использовал очереди и обработку вызовов.

Быстрый пример постановки в очередь

<html>
<header>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js" ></script>
<script>
  function fakey_not_ajax(message, callback) {
    alert (message);
    callback();
  }
  function queue_my_stuff( kick_it_off_callback ) {
    $(document).queue("mydemo_queue", function(){
      fakey_not_ajax("show me first", function() { 
        $(document).dequeue("mydemo_queue");
      });
    });
    $(document).queue("mydemo_queue", function(){
      fakey_not_ajax("show me second", function() { 
        $(document).dequeue("mydemo_queue");
      });
    });

    kick_it_off_callback();
  }
  function push_the_button() {
    alert ("pushed");
    queue_my_stuff(
      function(){ 
        $(document).dequeue("mydemo_queue");
      }
    );
  }
</script>
</header>
<body>
Try this
<a href="#" onclick="push_the_button();">Push Me</a>
</body>
</html>
...