Foros del Web » Programando para Internet » Javascript »

Resultado UNDEFINE en funcion

Estas en el tema de Resultado UNDEFINE en funcion en el foro de Javascript en Foros del Web. Saludos a todos solicito de su apoyo con una duda que tengo, que es la siguiente: Estoy armando un menu con submenu de boostrap, con ...
  #1 (permalink)  
Antiguo 17/04/2020, 15:08
Avatar de humansl11  
Fecha de Ingreso: octubre-2009
Ubicación: Mexico
Mensajes: 61
Antigüedad: 10 años, 7 meses
Puntos: 0
Resultado UNDEFINE en funcion

Saludos a todos solicito de su apoyo con una duda que tengo, que es la siguiente:

Estoy armando un menu con submenu de boostrap, con dos funciones
-La Funcion 1 trae todos las opciones sin los submenus (ya lo muestro sin problemas), dentro de la funcion 1 envio ciertos datos a la funcion 2 la cual dependiendo de esos datos hace una cosulta ajax y crea las opciones con sus submenus.

-El problema es que cuando en la funcion 1 intento concatenar el resultado de la funcion 2 con otras variables de la funcion 1 si me muestra los intentos correcto pero me devuelve UNDEFINE, ya realize un console.log en la funcion 2 y si genera los elementos espero puedas ayudarme saludos.

Pongo codigo de ambas funciones

Código:
 
ESTA FUNCION CREA EL MENU 
function creamenu(){

    var usuarioEMnu = $("#idUsuarioMenu").val();


      var conadmin = "<ul class='sidebar-menu' data-widget='tree'>"
      +"<li><a href='panel'><i class='fa fa-home'></i> <span>Inicio</span></a></li>";

      var vauno = "<li class='header'>Areas</li>";
       conteniodconsu = "";
      
       //https://www.youtube.com/watch?v=0ELGh2mXas4
      
      /* obtenemos todos los valores de la base de datos sin filtro por ser administrador */
      $.ajax({
        url: 'home/menuadminconsu',
        type: 'POST',
        dataType: 'json',
        contentType: false,
        processData: false,
        cache: false,
      }).done(function(res) {

        res.data.forEach(function(persona, index) {
          
          

         !!!!! AQUI ES DONDE INVOCO LA FUNCION Y DONDE ME TENDRIA QUE REGRESAR LA VARIABLE CON TODOS LOS ELEMENTOS CREADOS
         concen += " "+ creamenusub(persona.dato,persona.icono,persona.nombre);
   
        });
        /* creamos variable con contenido de admin  */
        conadmindi ="<li class='header'>Administración</li>"
        +"<li class='treeview'>"
        +"<a style='cursor:pointer'><i class='fa fa-search'></i> <span>Catalogos</span><span class='pull-right-container'><i class='fa fa-angle-left pull-right'></i></span></a>"
        +"<ul class='treeview-menu'>"
        +"<li><a href='catAdmin/ubicacion'><i class='fa fa-circle-o'></i>Ubicaciones</a></li>"
        +"<li><a href='catAdmin/areas'><i class='fa fa-circle-o'></i>Áreas</a></li>"
        +"</ul>"
        +"</li>"
        +"<li><a href='soporte/admin'><i class='fa fa-cogs'></i> <span>Soporte</span></a></li>"
        +"<li><a href='portada'><i class='fa fa-slideshare'></i> <span>Portada</span></a></li>"
        +"<li><a href='menu'><i class='fa fa-bars'></i> <span>Menu</span></a></li>"
        +"<li><a href='usuarios'><i class='fa fa-address-book-o'></i> <span>Usuarios</span></a></li>"
        +"<li><a href='buzon'><i class='fa fa-newspaper-o'></i> <span>Buzón</span></a></li>"
        +"<li class='treeview'>"
        +"<a style='cursor:pointer'><i class='fa fa-search'></i> <span>Logs</span><span class='pull-right-container'><i class='fa fa-angle-left pull-right'></i></span></a>"
        +"<ul class='treeview-menu'>"
        +"<li><a href='log/acceso'>Acceso</a></li>"
        +"<li><a href='log/actividades'>Actividades</a></li>"
        +"</ul>"
        +"</li>"
        +"</ul>";

        var final = conadmin +" "+ vauno +" "+ conteniodconsu +" "+ conadmindi;

        //alert(final);
        //console.log(final);
        $("#menugeneral").html(final);
        
      }).fail(function(err) {
        toastr.error('Hubo un error en la petición', '¡Upss!');
      })

      

   

  }

  /* funcion para ver si la seccion del menu cuenta con submodulos */
  function creamenusub(valor,icono,nombre){
    /* enviamos el valor por el data */

    data        = new FormData(),
    data.append('padre', valor);

    $.ajax({
      url: 'home/menuadminconsusub',
      type: 'POST',
      dataType: 'json',
      contentType: false,
      processData: false,
      cache: false,
      data: data
    }).done(function(res) {
      
      contenido = "";

      if(res.data == false){
        /* en este caso no tenemos  submenu y creamos la variable normal*/
        contenido += "<li><a href='"+valor+"'><i class='fa "+icono+"'></i> "+nombre+"</a></li> ";
        conteniodconsu = contenido;

      }
      else{
        var medio = '';
        var inicion= '';
        /* en eset caso creamos el menu con submenus */
        inicion += "<li class='treeview'><a style='cursor:pointer'><i class='fa "+icono+"'></i> <span>"+nombre+"</span><span class='pull-right-container'><i class='fa fa-angle-left pull-right'></i></span></a><ul class='treeview-menu'>";
        /* aqui recorremos el resultado del sub para traer la opciones */
        res.data.forEach(function(persona, index) {
          medio += "<li><a href='"+valor+"/"+persona.dato+"'><i class='fa "+persona.icono+"'></i>"+persona.nombre+"</a></li>";
        });
        var fin ="</ul></li>";
        
        contenido += inicion + medio + fin;
        conteniodconsu = contenido;

        
      }
      console.log(conteniodconsu);
      return conteniodconsu;

    }).fail(function(err) {
      toastr.error('Hubo un error en la petición', '¡Upss!');
    })


  }
  #2 (permalink)  
Antiguo 18/04/2020, 10:29
 
Fecha de Ingreso: abril-2006
Mensajes: 426
Antigüedad: 14 años, 1 mes
Puntos: 96
Respuesta: Resultado UNDEFINE en funcion

por lo visto tu error esta aca

Código Javascript:
Ver original
  1. concen += " "+ creamenusub(persona.dato,persona.icono,persona.nombre);
tu funcion creamenusub(persona.dato,persona.icono,persona.nom bre);

esta mal planteada, por que dentro de esa funcione estas haciendo uso de un Promise
en resumen, le estas pidiendo a tu funcion "creamenusub" un resultado, pero dentro de tu funcion al hacer uso de AJAX, toma su tiempo, cuando haces esto

$.ajax({

estas creando otro trabajo en paralelo, que puede demorar su tiempo, y como es paralelo, tu funcion no tiene como esperar la respuesta,

haberigua sobre los "Promise" para que te hagas una idea, del funcionamiento exacto, si tu applicacion esta enfocada a navegadores modernos, tienes la opcion de usar "await" tambien averigua sobre ello, que es lo que necesitas realmente, o cambia un poco tu enfoque, con respecto a javascript
__________________
Mis aportes te ayudaron??, te hicieron ahorrar valiosos tiempo??, si quieres puedes agradecerme con un Gracias o con una donacion
https://paypal.com/pools/c/8lmNLmWnG9
  #3 (permalink)  
Antiguo 18/04/2020, 12:44
 
Fecha de Ingreso: abril-2011
Mensajes: 125
Antigüedad: 9 años, 2 meses
Puntos: 44
Respuesta: Resultado UNDEFINE en funcion

Si quieres que tu código funcione cuanto antes, añade async: false dentro de las opciones de la petición en la función creamenusub:

Código Javascript:
Ver original
  1. $.ajax({
  2.       url: 'home/menuadminconsusub',
  3.       type: 'POST',
  4.       async: false,
  5.       dataType: 'json',
  6.       contentType: false,
  7.       processData: false,
  8.       cache: false,
  9.       data: data
  10. })

Esto hace que la petición AJAX se haga de forma sincrónica, lo cual va en contra de la naturaleza de AJAX (pensado para trabajar de forma asíncrona), pero al menos evita que tengas que refactorizar todo el código.

Si quieres refactorizar todo el código (recomendable), evita hacer uso de variables globales, es complicado manejarlas y difícil para depurar.
  #4 (permalink)  
Antiguo 20/04/2020, 08:11
Avatar de humansl11  
Fecha de Ingreso: octubre-2009
Ubicación: Mexico
Mensajes: 61
Antigüedad: 10 años, 7 meses
Puntos: 0
Respuesta: Resultado UNDEFINE en funcion

Te agradezco lo probare



La zona horaria es GMT -6. Ahora son las 12:05.