0

Realizando un return de una consulta en SQLite a una variable, el objeto queda como si estuviera encapsulado o no se como se llama, pero en la consola aparece como Promise, dentro de el la información esta dentro de un value, la cual esta dentro de un $$state. Esta es la forma de la estructura del retorno del objeto:

Promise {$$state: Object}
  $$state: Object
  status: 1
  value: Object
    apellido: "Vides"
    cedula: 11223344
    facultad: "Tecno e Ing"
    nombre: "Diego"
    programa: "Sistemas"
    rol: "Estudiante"
    semestre: 10

El código es el siguiente:

angular.module('perfilEstu', ['ionic', 'ngCordova'])
   .controller('perfilEstudiante', perfilEstudiante)
   .factory('obtenerPerfil', obtenerPerfil);

perfilEstudiante.$inject = ['$scope', 'obtenerPerfil'];

function perfilEstudiante($scope, obtenerPerfil) {
   var Perfil, fila, i, l_perfil, db, sqlConsulta;
   Perfil = obtenerPerfil.datosPerfil();
   console.log(Perfil);       

};

obtenerPerfil.$inject = ['$cordovaSQLite', '$q'];

function obtenerPerfil($cordovaSQLite, $q) {

function datosPerfil(){       
    var sqlConsulta, db, perfil, datos, l_perfil, i, fila, deferObject;
    deferObject =  deferObject || $q.defer();
    sqlConsulta = "SELECT * FROM Estudiante"
    perfil = {};
    db = $cordovaSQLite.openDB({ name: "unicesar.db" });
    perfil = $cordovaSQLite.execute(db, sqlConsulta, []).then(function(resultado) {
        l_perfil = resultado.rows.length;
        for(i=0 ; i<l_perfil ; i++){
            fila = resultado.rows.item(i);
            datos = {
                cedula: fila.Cedula,
                nombre: fila.Nombre,
                apellido: fila.Apellido,
                rol: "Estudiante",
                facultad: fila.Facultad,
                programa: fila.Programa,
                semestre: fila.Semestre
            };
        }
        return datos;
    }, function (err) {
        console.error(err);
    });   
    deferObject.resolve(perfil);
    return deferObject.promise; 
};    
  return {
      datosPerfil: datosPerfil
  };
};

Quisiera obtener el objeto de tal manera que lo pusiera de esta forma en la vista:

   $scope.Cedula = Perfil.cedula;
   $scope.Nombre = Perfil.nombre;
   $scope.Apellido = Perfil.apellido;
   $scope.Rol = Perfil.Rol;
   $scope.Facultad = Perfil.facultad;
   $scope.Programa = Perfil.programa;
   $scope.Semestre = Perfil.semestre;

Aquí dejo una imagen de lo que muestra la consola utilizando chrome://inspect

Obejeto Promise

Gracias de ante mano por cualquier ayuda.

Wilfredo
  • 2,455
  • 3
  • 20
  • 35
  • Hola, ¿que información quieres devolver, la de todos los estudiantes o la de uno solo? Si es la de uno solo te faltaría un parametro para identificarlo y modificar la SQL para filtrar la consulta – rsciriano Apr 30 '16 at 20:21
  • @rsciriano, pues lo que quiero es poder mostrar el objeto en el html, pero es una Promise, y si uso then, me dice que no es una funcion, que solución me darias – Pedro Miguel Pimienta Morales Apr 30 '16 at 21:54

1 Answers1

3

Estás obteniendo un promise porque eso es lo que estás devolviendo desde la factoría por lo que para añadirlo al scope te bastaría con usar then en el controlador

function perfilEstudiante($scope, obtenerPerfil) {

    obtenerPerfil.datosPerfil().then(function(datos){
        $scope.Perfil = datos;
        console.log(datos);               
    })
};

Por otro lado la implementación del método con el que devuelves los datos de los perfiles no es correcta.

  • La llamada a deferObject.resolve(perfil) se debería hacer cuando se devuelven los datos de la consulta

  • Realmente no necesitas crear un defered para devolver los datos de la consulta porque puedes devolver directamente el promise de la ejecución de consulta encadenando en el then la transformación de datos

  • Al hacer el bucle estás sobrescribiendo el valor de los datos por lo que solo devolverás el último

La implementación para devolver la lista de datos todos los perfiles aplicando lo que te comento se podría hacer de la siguiente manera

function obtenerPerfil($cordovaSQLite) {
    function datosPerfil(){       
        var sqlConsulta = "SELECT * FROM Estudiante";
        var db = $cordovaSQLite.openDB({ name: "unicesar.db" });
        return $cordovaSQLite.execute(db, sqlConsulta, []).then(function(resultado) {
            var datos = [];
            for(i=0 ; i<resultado.rows.length ; i++){
                var fila = resultado.rows.item(i);
                datos.push({
                    cedula: fila.Cedula,
                    nombre: fila.Nombre,
                    apellido: fila.Apellido,
                    rol: "Estudiante",
                    facultad: fila.Facultad,
                    programa: fila.Programa,
                    semestre: fila.Semestre
                });
            }
            return datos;
        }, function (err) {
            console.error(err);
        });    
    };

    return {
        datosPerfil: datosPerfil
    };
};

P.D: Creo que en vez de usar factory, deberías usar service porque realmente no lo estás usando como una factoría. Prueba a registarlo como un servicio y debería seguir funcionando

rsciriano
  • 2,072
  • 11
  • 27