JQuery обратный вызов при успешном выполнении асинхронной функции - PullRequest
0 голосов
/ 25 мая 2018

Я получаю немного XML через Ajax и обрабатываю его, вызывая функцию в случае успеха.

Из функции успеха (handleHousestark) я проверяю XML и вызываю другую функцию (getJonSnow) для добавления некоторых дополнительных данных. Все работает нормально, если я установил getJonSnow в async: false.Без этого это не работает.

$( document ).ready(function() {
  $( "#button" ).click(function() {
    $.ajax({
      url: "test_php.php?function=getmain",
      cache: false,                           
      success: handleHousestark                       
    });
  });
});

function handleHousestark(html) {   
  var feature="";
  var xml = html;
  xmlDoc = $.parseXML( xml );
  $xml = $( xmlDoc );

  $($xml).find( "features" ).children().each(function(index) {
    var attributevalue = $(this).attr('value');
    var attributeunittype = $(this).attr('type');     
    var attributecode = $(this).attr('code');  
    if(attributeunittype!="Valuelist") {
      feature=feature+"<B>"+attributevalue+"</B><BR/>";
    }

    if(attributeunittype=="Valuelist") {
      values = getJonSnow(attributecode,function(res) { 
        ///THIS WORKS WITH getJonSnow on async false, otherwise doesn't work.           feature=feature+"<B>"+res+"</B><BR/>";
      });
    }   
  }); 
  $("#content").html(feature);
}

function getJonSnow(attributecode,callback) {
  $.ajax({
    url: "test_php.php?function=getvalues",
    cache: false,     
    success:  callback                  
  });
}

Ответы [ 2 ]

0 голосов
/ 21 июня 2018

В итоге я выполнил это с await и async, которые работали очень хорошо.Я не занимался ajax в течение нескольких лет и немного отстал с последними методологиями.

Пример ниже, я не тестировал этот образец, но, надеюсь, другие люди получили jist.

$( document ).ready(function() {
  $( "#button" ).click(function() {
    $.ajax({
      url: "test_php.php?function=getmain",
      cache: false                      
    })
    .done(function(data)
                        {

                            handleHousestark(data);

                        })  ;
  });
});

async function handleHousestark(html) {   
  var feature="";
  var xml = html;
  xmlDoc = $.parseXML( xml );
  $xml = $( xmlDoc );

  $($xml).find( "features" ).children().each(function(index) {
    var attributevalue = $(this).attr('value');
    var attributeunittype = $(this).attr('type');     
    var attributecode = $(this).attr('code');  

    values=await getJonSnow(attributecode);

    if(attributeunittype!="Valuelist") {
      feature=feature+"<B>"+attributevalue+"</B>"+values+"<BR/>";
    }


    }   
  }); 
  $("#content").html(feature);
}

async function getJonSnow(attributecode) {

  const  tmp = $.ajax({
    url: "test_php.php?function=getvalues",
    cache: false               
  });

  return  tmp;
}
0 голосов
/ 25 мая 2018

Я думаю, что $("#content").html(feature); будет выполнено до feature=feature+"<B>"+res+"</B><BR/>";.Для возврата ответа на запрос к серверу требуется время. Если вы не установите асинхронное значение в false, приведенный ниже код будет выполнен до того, как результат поступит из http-запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...