2014-02-27 28 views
2

在異步函數調用後從工廠返回角度$資源。

下面顯示了我試圖返回$資源的角廠的一個例子。

我想在返回$資源之前使用另一個服務進行異步函數調用以接收Web服務路徑。

這可能嗎?

angular.module('app').factory('newService', function($resource, configService) { 
    configService.get(function(config) { 
     return $resource(config.webServicePath + '/api/names', {}, 
      { 'update': { method:'PUT' } } 
     ); 
    }); 
}); 

會有人具有的一例任一種服務,提供者,或工廠的異步函數調用之後返回的資源來接收像上述信息。

如果您可以提供在控制器中使用的newService的示例,這也會很有幫助。

在此先感謝您的幫助。

+0

「返回」和「異步」通常不混合。你想要承諾和回調。 Angular有一個名爲'$ q'的服務,請參閱http://docs.angularjs.org/api/ng/service/$q。大多數角度請求已經返回承諾。 – elclanrs

回答

3

目前,它的回調是返回resource,這並沒有多大幫助。在異步函數完成之前,您不能延遲返回語句,但可以使用$q承諾。

ngular.module('app').factory('newService', function($resource, configService, $q) { 
    var resourcePromise = $q.defer(); 
    configService.get(function(config) { 
     resourcePromise.resolve($resource(config.webServicePath + '/api/names', {}, 
      { 'update': { method:'PUT' } } 
     )); 
    }); 
    return resourcePromise.promise; 
}); 

這裏是如何工作的$q

  1. 您需要返回您在未來得到一個值,所以你推遲它使用$q.defer()
  2. 這將返回延期對象。
  3. 您進行異步調用,並在其成功回調中調用.resolve上的延遲對象。
  4. 如果回調失敗,您可以在延遲對象上調用.reject
  5. 您將返回deferredobject.promise,這是一個承諾對象。

使用當你期望從一個承諾的值返回承諾

服務,您可以通過將回調到其then方法聽它。如果承諾可能會被拒絕(操作失敗),那麼傳遞第二個回調是個好主意,當承諾被拒絕時會被調用。

下面是返回一個承諾服務,以及如何使用它的一個簡單的例子:

http://jsfiddle.net/rP5Gh/