entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Orden de ejecución de JS

Hola buenas tardes; mi duda ahora es ¿Como controlar el orden de la ejecución de un codigo de javascript?

var cadena;
var msj = "Cargando";
  //OBTENER JSON
  $.ajax({
    url : "http://192.168.0.22:8081/JSON/datos.php",
    dataType: 'jsonp',
    success:function(h){
     alert("Success");
     alert(h);
     cadena = h;
     alert(cadena.status);
 },
 error:function(){
     alert("Error");
 }  
});
   //OBTENER JSON
   alert(msj);
   alert(cadena);
  //PINTAR PREGUNTAS
    for( var i = 0; i < cadena.registro.length; i++ ) {
     document.write("<div class=\"panel panel-default\"><div class=\"panel-heading\">"+
        cadena.registro[i].Pregunta + "</div> <div class=\"panel-body\">");
            for( var j = 0; j < cadena.registro[i].Respuestas.length; j++ )
      {
    document.write(" <div class=\"radio\">  <input type=\"radio\" name=\"optradio\">  "+cadena.registro[i].Respuestas[j]+"</div>");
      }
      document.write("</div></div></div>");
      }//PINTAR PREGUNTAS

En el código anterior si se ejecuta secuencialmente al momento de llegar a la seccion de "PINTAR PREGUNTAS" mi variable de cadena ya tendría el valor que se obtuvo en el callback de ajax pero como se ejecuta todo de manera asincrona al momento de pintar este aun no cuenta con un valor ¿Existe alguna forma de regular el flujo de ejecucion?

1 Respuesta

4votos

white Puntos75880

crea una funcion para pintar, de esta forma la podrias invocar dentro de $.ajax({}); con el callback success

ejemplo:

var msj = "Cargando";
function pintar(cadena)
{
   //OBTENER JSON
   alert(msj);
   alert(cadena);
  //PINTAR PREGUNTAS
    for( var i = 0; i < cadena.registro.length; i++ ) {
     document.write("<div class=\"panel panel-default\"><div class=\"panel-heading\">"+
        cadena.registro[i].Pregunta + "</div> <div class=\"panel-body\">");
            for( var j = 0; j < cadena.registro[i].Respuestas.length; j++ )
      {
    document.write(" <div class=\"radio\">  <input type=\"radio\" name=\"optradio\">  "+cadena.registro[i].Respuestas[j]+"</div>");
      }
      document.write("</div></div></div>");
      }//PINTAR PREGUNTAS
}

//OBTENER JSON
  alert(msj);
  $.ajax({
    url : "http://192.168.0.22:8081/JSON/datos.php",
    dataType: 'jsonp',
    success:function(h){
     alert("Success");
     msj = "end loading...";
     alert(h);
     pintar(h);
     alert(h.status);
 },
 error:function(){
     alert("Error");
 }  
});

0voto

AdanCervera comentado

Caballero; a usted le voy a poner una casa jaja muchas gracias me funciono a la perfección ya tenia bastante tiempo buscando como hacerlo solo al parecer no me me cargo la libreria de bootstrap pero es algo con lo que me peleare mas adelante. Muchas gracias.

0voto

white comentado

Me alegra se haya solucionado C:
si tienes mas dudas no dudes en poner tus dudas/problemas con entredesarrolladores, bueno xD a cambio de una casa podrias recomendar el sitio.

saludos!

0voto

carlossevi comentado

Enhorabuena a ambos por resolver tan rápido la cuestión. Por aportar algo de teoría al problema me gustaría compartir un par de enlace en los que se aclara que de forma predeterminada jQuery ejecuta todas las sentencias asociadas a un evento al mismo tiempo. De ahí que la solución para forzar una ejecución secuencial de sentencias sea, como bien ha apuntado @white, el uso correcto de los callbacks.

http://www.kilbot.net/efectos-secuenciales-en-jquery/
http://www.desarrolloweb.com/articulos/callback-funciones-jquery.html (incluye buenos ejemplos)

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta