2016-10-19 6 views
4

Angular 1.3에서 작동 할 수있는 무언가를 얻으려고 미쳐 버렸습니다 ... 가능할 수도 있지만 ... 꼭 그래야만합니다. 기본적으로, 나는 계산 된 값만을 반환하는 서비스를 작성하고 싶습니다. 약속은 아닙니다.Angular 1 service in service

$ http.get 요청을하고 약속을하는 서비스가 있습니다. 다른 서비스에서 이것을 호출하고 해당 데이터를 가져 와서 조작하고 값을 반환하고 싶습니다. 나는 일단 내 봉사를 부름 받았다. 내 추론은 전화를 걸고 실제 값을받을 수있는 공유 가능한 기능을 갖고 싶기 때문에 ng-show와 같은 조건으로 사용할 수 있습니다. 내가 말했듯이 컨트롤러에서이 함수를 작성하고 약속의 데이터를 변수에 할당 할 수는 있지만이 변수를 필요한 모든 단일 컨트롤러에 쓰고 싶지는 않습니다.

예 :

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; 
    } 
    }; 
}]); 

저는 컨트롤러에서 이것을 호출하고 "5"등을 얻을 수 있기를 바랍니다. 또는 "ng-show ="blahCtrl.getItemCount ('item_search_string') == 0과 같은 ng-show에서 호출하는 것이 더 좋습니다. 다시 말하지만, 필자가 필요로하는 컨트롤러가 여러 개 있기 때문에 복제하지 않을 것입니다. 함수는 모든 곳에서 필요한 수를 추출하는 데에만 사용됩니다.

이것은 나를 위해 작동하지 않습니다 ... 내 반환 값은 항상 내가 처음에 this.count를 설정 한 것입니다. 콘솔을 삽입했습니다. .log 몇 군데, this.count가 콜백 함수가 값을 설정할 수 있기 전에 반환 된 것 같습니다. 내가 무엇을 하든지,이 서비스에서 하나의 값을 반환 할 수는 없으며 나를 운전하고 있습니다. 더 이상 혼란스러워하는 이유는 내가 컨트롤러 내부에서이 코드를 작성하면된다 :

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

잘 작동하고 searchResults 변수 내에서 내 약속 데이터를 바로 얻을 수 있습니다. 어떤 이유로 든 서비스 내부에서 그런 식으로 작동하지 않습니다.

희망적으로 이것은 의미가 있습니다. 나는 조금 어슬렁 거리거나 불분명했을 것입니다. 어떤 도움을 주시면 감사하겠습니다 ... 나는 가능한 한 많은 시간을 연구하고 시행 착오를 사용하고 있습니다.

감사합니다.

+0

이 걸릴 각 ng-if에 대한 요청을 만들기 위해 나쁜 너의 소원에 아주 가까운 Restangular의 $ 객체 사용법을 봐라 ... –

+1

은 당신의 요구에서 나온 것처럼 보이기 때문에 performSearch는 개인적인 기능이 될 것이다. 그래서 왜 retu 일까? 그거야. 대신 {getItemCount : function() {....}}을 반환하십시오. return {} 바로 전에 performSearch() {} 함수를 작성하십시오. 이 방법으로 정의하고 반환하지 않을 때이 함수는 비공개 함수입니다. performSearch 호출을 원한다면 사용해야합니다.그런 다음 의미 론적으로 만 의미가 있습니다 - "performSearch를 호출하고 결과에 따라 다음을 호출하십시오 - DO - 뭔가. 코드 품질과 구문이 원하는 것 사이에 갇혀있는 것처럼 보입니다 – Mahesh

답변

0

$ q (https://docs.angularjs.org/api/ng/service/ $ q)를 사용해야 할 것입니다. 약속이 이행되기 전에 귀하의 기능이 복귀하고 있습니다. 귀하의 getItemCount는 다음과 같아야합니다 :

app.factory('searchService', ['$http', '$q', function($http, $q) { 
    return { 
    performSearch: function(searchString) { 
     return $http.get('http://asdf.com/search/' + searchString); 
    }, 
    getItemCount: function(itemName) { 
     var deferred = $q.defer(); 

     this.performSearch(itemName).then(
     function successCallback(resp) { 
      deferred.resolve(resp.data.items.length); 
     }, 
     function errorCallback(err) { 
      deferred.reject(err); 
     }; 

     return deferred.promise; 
    } 
    }; 
}]); 
+0

그래도 여전히 올바른 약속이 반환됩니다. {}} – user165222

+0

이것은'resp.data.items.length'로 해결 될 약속을 반환합니다. 콘솔하려는 경우. 예를 들어'getItemCount ('myitem'). then (function (response) {console.log (response)});' –

+0

예. 하지만 여기에있는 요점은이 서비스 함수를 실행할 때 정수를 반환하는 것입니다. 다시 처리해야한다는 약속이 아닙니다.이 작업을 수행 할 방법이 없습니까?) 내 performSearch() 함수 및 거기에 약속을 해결할 때 다음 getItemCount 때 그냥 ab 수 안된다 그러면 performSearch(). then()을 호출하고 반환 된 변수에 해결 된 약속의 데이터를 할당 하시겠습니까? 하지만 결코 그런 식으로 작동하지 않습니다 ... 항상 내 performSearch()를 건너 뛰고 기다리지 않고 반환합니다. – user165222

1

하나의 해결책이 나와 있습니다.

컨트롤러

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

을 한 번이를 넣고 모두보기

{{ searchService.count }} 

얻을 그리고 내가 생각, 그것은 등 ng-show