2014-02-27 29 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/