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

como crear un promise en un servicio de Angular JS?

Hola, otra vez yo.

Tengo un servicio que aun, no realiza una peticion $http (para poder recuperar un promise de una petición asincrona).

.factory('UserSearch', [function UserSearchFactory(){
        var service = {};

        service.searchTypes = [
            {
                type: "all",
                text: "Todos"
            },
            {
                type: "email",
                text: "Correo"
            },
        ];

        service.getSearchTypes = function(){
            return this.searchTypes;
        };

        return service;
    }]);

Sin embargo si yo requiero utilizar los datos del resultado, obviamente estaran indefinidos.

.controller('SearchUserController',['UserSearch', '$scope', function(UserSearch, $scope){
    var controller = this;

    $scope.searchTypes = UserSearch.getSearchTypes();

    $scope.selectedsearch = $scope.searchTypes;  // <<< Este obviamente será undefined
}]);

¿Como puedo crear un tipo de promise para poder resolver esto, y que no tome los valores una vez que el servicio le indique que ya puede hacerlo?

Algo como:

$scope.searchTypes.onSuccessEvent(function(){
    $scope.selectedsearch = $scope.searchType.obtainedValue;
});

1 Respuesta

2votos

white Puntos75880

el servicio $http retorna una promesa, si deseas envolver una funcion en una promesa puedes usar el servicio $q.

si en tu servicio tienes:

(function() {
    'use strict';

    angular
        .module('app')
        .factory('UserSearch', UserSearch);

    UserSearch.$inject = ['$http', '$q'];

    function UserSearch($http, $q) {
        var service = {
            getSearchTypes: getSearchTypes
        };

        return service;

       function getSearchTypes() {
            var deferred = $q.defer();

            // aca vamos a realizar una tarea asincrona, una peticion http, un timer, etc...
            setTimeout(function() {
                deferred.resolve({ data: 'etc'});
            }, 1000);

            return deferred.promise;
       }
    }
}()):

entonces el metodo de tu servicio UserSearch "getSearchTypes" devolveria una promesa, si vas a usar el servicio $http entonces no es necesario que uses el servicio $q ya que como te mencione $http devuelve una promesa de por si.

$http.get('/etc/', { params: etc }).then(function() {
    // cuando la promesa se resolvio...
});

https://docs.angularjs.org/api/ng/service/$q


The $http API is based on the deferred/promise APIs exposed by the $q service. While for simple usage patterns this doesn't matter much, for advanced usage it is important to familiarize yourself with these APIs and the guarantees they provide.

https://docs.angularjs.org/api/ng/service/$http

0voto

elporfirio comentado

Hoy reviso esta respuesta muchas gracias white :D me haz hecho el paro muchas veces pues así ya no tengo que leer todos, si no me enfoco en lo que necesito. (esto por que el proyecto ya esta empezando a atorarse)

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