Angular 1 promise en service

Me he vuelto loco intentando hacer que funcione algo en Angular 1.3 que ni siquiera es posible … pero parece que debería ser. Básicamente, me gustaría escribir un service que devuelva solo un valor calculado, no una promise.

Tengo un service que realiza una request de $ http.get y devuelve una promise. Me gustaría llamar a esto desde otro service, get esa información, manipularla y devolver un valor. No quiero tener que lidiar con eso. Una vez que haya llamado a mi service. Mi razonamiento es que me gustaría tener una function compartible a la que pueda llamar y recibir un valor real para que pueda usarlo como condición para algo como ng-show. Como digo, escribiría esta function en el controller y usaría .then para asignar una variable con los datos de la promise, pero no quiero escribir eso en cada controller en el que lo necesite.

Ejemplo:

app.factory('searchService', ['$http', function($http) { return { performSearch: function(searchString) { return $http.get('http://asdf.com/search/' + searchString); }, getItemCount: function(itemName) { var _this = this; this.count = 0; this.performSearch(itemName).then( function successCallback(resp) { _this.count = resp.data.items.length; }, function errorCallback() { // This section doesn't matter right now }; return this.count; } }; }]); 

Así que me gustaría simplemente poder llamar esto desde el controller y get un "5" o algo así. O mejor aún, llamándolo desde un ng-show como "ng-show =" blahCtrl.getItemCount ('item_search_string') == 0 ". De nuevo, tengo varios controlleres en los que puedo necesitar esto, así que preferiría no duplicar funciona por todos lados solo para extraer ese número que necesito.

Esto simplemente no me funciona … mi valor de retorno siempre es lo que inicialmente configuré this.count. He insertado un console.log en algunos lugares y he visto que (parece) esta count se devuelve antes de que la function de callback pueda establecer su valor. ¡No importa lo que haga, soy incapaz de devolver solo un valor de este service y me está volviendo loco! Lo que me confunde más es que si tuviera que hacer este código desde el interior del controller:

 var _this = this; searchService.performSearch('asdf').then( function(data) { _this.searchResults.data; } ); 

Funciona muy bien y obtengo los datos de mi promise dentro de la variable searchResults sin problema. Simplemente no funciona de esa manera dentro del service por alguna razón.

Espero que esto tenga sentido, es posible que haya divagado un poco o que no haya sido claro. Cualquier ayuda sería muy apreciada … He pasado tanto time investigando esto y usando testing y error por mi count como puedo.

¡Gracias!

Una solución como yo veo.

Pon esto una vez en el controller

 app.controller('ctrl', function ($scope, searchService) { $scope.searchService = searchService; searchService.getItemCount(); }); 

y entrar en todas las vistas

 {{ searchService.count }} 

Y creo que es malo hacer una request para cada ng-if , ng-show etc.

Necesitará usar $ q ( https://docs.angularjs.org/api/ng/service/ $ q). Tu function regresa antes de que se cumpla la promise. Su getItemCount debería verse así:

 app.factory('searchService', ['$http', '$q', function($http, $q) { return { performSearch: function(searchString) { return $http.get('http://asdf.com/search/' + searchString); }, getItemCount: function(itemName) { var defernetworking = $q.defer(); this.performSearch(itemName).then( function successCallback(resp) { defernetworking.resolve(resp.data.items.length); }, function errorCallback(err) { defernetworking.reject(err); }; return defernetworking.promise; } }; }]);