2016-03-07 48 views
0

讓我們假設我有一個簡單的服務:如何創建既返回承諾又展示一組函數的服務?

angular.module('myModule') 
    .factory('myService', ['$http', function($http) { 
     return $http.get('/something'); 
    }]); 

現在,每當我注射服務爲一體的控制器,對於承諾的路由器等待改變路線,這正是我想要的東西之前解決。

但是,似乎沒有辦法從服務中返回其他數據。如果服務還需要提供某些方法會怎麼樣?如何在保持上述依賴關係行爲的同時做到這一點?

回答

1

可以使用角度實施承諾模式$q創建一個承諾,當$http.get得到解決,這將得到解決,而且解決的主要一個與你的HTTP資源和其他數據和功能的數據來:

angular.module('myModule') 
    .factory('myService', ['$http', '$q', 
    function($http, $q) { 
     var deferred = $q.defer(); 

     $http.get('/something').then(function(data) { 
     deferred.resolve({ 
      data: data, 
      doStuff: function() {} 
     }); 
     }); 

     return deferred.promise; 
    } 
    ]); 

順便說一句,我不確定某些HTTP請求的結果是否完全是服務。看起來整個GET應該被你的myService服務的函數封裝,並在一些控制器,服務,指令或任何你需要調用它的地方調用它,並在那裏提供.then的延續。

或者,如果您使用的是UI路由器,則可以調用一個服務函數,該函數返回一個route resolver的承諾,它將在以正確的方式實現您的服務時完成這項工作。

+0

謝謝。關於GET請求,它會檢索服務第一次啓動時需要的一些數據。 –

+0

@NathanOsman那麼,一般來說,我已經提供了一個很好的暗示你如何解決你的問題。閱讀我更新的答案,我已經提供給你更多的信息 –

+0

太好了,謝謝你的想法。 –