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

Return me devuelve nulo en AngularJS

Buenas, el caso es que estoy intentado ejecutar una funcion en Angular-JS que haga una llamada a un fichero, obtenga un dato y me lo devuelva, pero por mas que intento siempre me devuelve lo mismo

La funcion en la siguiente

    $scope.getDate = function (value) {
        var time = 0;
        $http({
            method: 'GET',
            url: 'mock/build-'+value+'.xml',
            headers: {
                Authorization: 'Basic OjM5NzI1MTkwMzM0Njg3NTM4ODY='
            }
        }).success(function (data,status) {
            $scope.buildAlt = new X2JS().xml_str2json(data);
            var auxiliary = angular.fromJson($scope.buildAlt);
            time = auxiliary.build.finishDate;
            console.log('BuildName : ' + auxiliary.build._buildTypeId);
            console.log('Time : ' + time);
        //    $scope.getError(status,'build',value);
        //    $scope.testing.push(time);
        //    console.log($scope.testing);
        }).error(function (data,status) {
            $scope.testing.push('');
            //$scope.getError(status,'build',value);
        }); 
        return time;
    };

Y el HTML desde donde la ejecuto :

                <div class="update-container col-xs-12">
                <time ng-repeat="index in build"> <!--ng-if="index._id == values._id"-->
                    <!--<i>{{index.finishDate | date:'shortDate'}}</i>-->
                    <i ng-init="updateDate = (getDate(values._id))">{{updateDate}}</i>
                </time>
                <div class="status-container" ng-repeat="buildsData in builds">
                    <div class="status glyphicon" ng-repeat="buildStatus in buildsData.build | orderBy:'_id'"
                         ng-if="buildStatus._buildTypeId == values._buildTypeId"
                         ng-class="{'glyphicon-ok': buildStatus._status=='SUCCESS','glyphicon-remove': buildStatus._status=='FAILURE','glyphicon-minus': buildStatus._status=='cancel'}"></div>
                </div>
            </div>

0voto

cloudman comentado

Buenas.

Inyectaste el servicio $q?

Un saludo.

2 Respuestas

1voto

Villanuevand Puntos5730

Hola, no sé, si ya haz resuelto este probema, pero acá te dejo mi respuesta.
Claro dice que $q is not defined porque es muy probable que en la función fábrica no inyectaste $q.
Debes inyectarla a la función fábrica siguiendo cualquiera de los patrones que colocaré a continuación.

app.controller('MiCtrl',['$q','$http',function($q,$http){
 //Lógica del controlador acá
}])

O también de la siguiente manera.

angular
   .module('mimodulo')
   .controller('MiCtrl','funcionFabrica);
// Inyectando dependencias del controlador
funcionFabrica.$Inject = ['$q','$http'];
function funcionFabrica($q,$http){
  // Lógica del controlador acá
}

Ojalá esto te sea útil.
Saludos desde Venezuela

0voto

Negimaru comentado

Si, lo había solucionado ya, pero cambiando todo el código entero, muchas gracias por la respuesta,la tendré en cuenta en el futuro porque seguro que me hará falta inyectar $q.

2votos

cloudman Puntos4020

Buenas tardes.

Me da la impresión de que el procesamiento al consultar el fichero es "pesado" y provoca que no pueda retornar un valor que aún no ha calculado. Deberías mirar las promesas y como angularjs realiza el tratamiento de llamadas asíncronas, y creo que solucionarías el problema que tienes. He modificado un poco tu código, aunque no lo he podido probar, y he añadido el retorno de una promesa. Deberías inyectar en tu servicio, factoría o donde hayas declarado esta función el servicio $q. Espero que te sea de ayuda. Pruébalo y nos cuentas.

 $scope.getDate = function (value) {
    var deferred = $q.defer();
    $http({
        method: 'GET',
        url: 'mock/build-'+value+'.xml',
        headers: {
            Authorization: 'Basic OjM5NzI1MTkwMzM0Njg3NTM4ODY='
        }
    }).success(function(data) { 
      deferred.resolve({
        $scope.buildAlt = new X2JS().xml_str2json(data);
        var auxiliary = angular.fromJson($scope.buildAlt);
        time = auxiliary.build.finishDate;
        console.log('BuildName : ' + auxiliary.build._buildTypeId);
        console.log('Time : ' + time);
    //  $scope.getError(status,'build',value);
    //  $scope.testing.push(time);
    //  console.log($scope.testing);})
    }).
   error(function(msg, code) {
      deferred.reject(msg);
      $scope.testing.push('');
      //$scope.getError(status,'build',value);
   });
return deferred.promise;
};

0voto

Negimaru comentado

Gracias por tu respuesta, mañana en el trabajo probare, seguramente sea como dices por la carga del fichero, tengo que admitir que tarda unos 40 segundos ya desde local.

0voto

Negimaru comentado

Lo he modificado un poco a esto:

       $scope.getDate = function (value) {
        var deferred = $q.defer();
        $http({
            method: 'GET',
            url: 'mock/build-'+value+'.xml',
            headers: {
                Authorization: 'Basic OjM5NzI1MTkwMzM0Njg3NTM4ODY='
            }
        }).success(function(data) {
            deferred.resolve(function(){
                $scope.buildAlt = new X2JS().xml_str2json(data);
                var auxiliary = angular.fromJson($scope.buildAlt);
                var time = auxiliary.build.finishDate;
                console.log('BuildName : ' + auxiliary.build._buildTypeId);
                console.log('Time : ' + time);
                //  $scope.getError(status,'build',value);
                //  $scope.testing.push(time);
                //  console.log($scope.testing);})
        })});
        return deferred.promise;
    };

}]);

Pero ahora me dice que $q is not defined

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