2016-10-19 106 views
4

我一直在瘋狂嘗試在Angular 1.3中工作,這可能甚至不可能......但它似乎應該是。基本上,我想寫一個服務,只返回一個計算值,而不是一個承諾。Angular 1承諾在服務

我有一個服務,使$ 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調用它,如「ng-show =」blahCtrl.getItemCount('item_search_string')== 0「。再次,我有多個控制器,我可能需要這個,所以我寧願不重複功能遍佈整個地方只是爲了提取我需要的數字

這只是不適用於我雖然...我的返回值總是無論我最初設置this.count是我插入一個控制檯.log幾個地方,看到(看起來)this.count是在回調函數可以設置它的值之前返回的。無論我做什麼,我都無法從這個服務中返回一個單一的值,並且它驅使我瘋了!更令我困惑的是,如果我要從控制器內部執行此代碼:

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

它工作得很好,我得到我的承諾數據在searchResults變量沒有問題。出於某種原因,它僅僅在服務內部不起作用。

希望這是有道理的,我可能會漫遊一下或不清楚。任何幫助將不勝感激...我花了大量的時間研究這一點,並盡我所能使用試驗和錯誤。

謝謝!

+0

採取看看$對象使用Restangular非常接近你的願望... –

+1

從你的要求,看起來像你打算performSearch是一個私人函數,所以爲什麼retu它。而是返回{getItemCount:function(){....}}。在返回{}之前寫入函數performSearch(){}。這是一個私人功能,當你這樣定義它,而不是返回它。如果你想調用performSearch,那麼必須使用。那麼只有在語義上纔有意義 - 「調用performSearch和THEN的結果--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

這仍然返回一個承諾,但是當我嘗試這個時,當我只是返回延期時,我看到它是{「promise」:{}} – user165222

+0

這將返回一個承諾,將解析爲'resp.data.items.length'。如果您想要控制檯。例如:'getItemCount('myitem')。then(function(response){console.log(response)});' –

+0

是的,我已經把這個語句放在了.then函數中。但是這裏要說的是,當我運行這個服務函數時,返回一個整數,而不是另一個承諾,我不得不再次處理。是否沒有辦法做到這一點?我的意思是,如果我添加一個.then( )到我的performSearch()函數並解決承諾,然後當我在getItemCount不應該只是ab le說performSearch()。then()並將解析後的promise中的數據分配給一個我可以返回的變量?但它永遠不會這樣...它總是跳過我的performSearch(),然後返回而無需等待。 – user165222

1

我看到一個解決方案。

在控制器

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

一次將這個和所有視圖

{{ searchService.count }} 

得到,我認爲,這是不好使的請求每個ng-ifng-show