如何包装依赖于异步调用的资源

时间:2015-06-19 07:39:40

标签: angularjs

我有一个包装资源的服务。我不得不重构它以获取一个从异步调用获得的参数(websiteId)。我以为我可以将资源包装在资源中,但是我得到了一个标准的注入错误。

使用包装资源的服务的正确方法是什么,使用来自承诺的参数?

searchApp.factory('MyTestService', ['$resource', 'WebsiteService', 'appConfig',  function ($resource, WebsiteService, appConfig) {
  WebsiteService.getCurrentWebsiteId().then(function(websiteId){
     return $resource(appConfig.apiBaseUrl + 'tests/:id/?website=:websiteId', {
        websiteId: websiteId
    });
  });
}]);

1 个答案:

答案 0 :(得分:1)

我会尝试这种方法:

searchApp.factory( 'MyTestService', [ '$resource', 'WebsiteService', 'appConfig', '$q'  function ( $resource, WebsiteService, appConfig, $q ) {
  var getService = function() {
    var defer = $q.defer();
    WebsiteService.getCurrentWebsiteId( function( websiteId ) {
      defer.resolve({ 
        websiteId : websiteId, 
        resource : $resource( appConfig.apiBaseUrl + 'tests/:id/?website=:websiteId', {
          websiteId: '@websiteId'
        })
      });
    });
    return defer.promise;
  };
  return getService;
}]);

主要区别是:

  • 从您的服务中回复承诺。
  • 前缀为@ - >的参数值那么价值 参数将从相应的属性中提取出来 数据对象(在调用操作方法时提供)。例如,如果 defaultParam对象是{someParam:' @ someProp'}然后是值 someParam将是data.someProp。

修改

如何使用

由于此服务返回一个值为资源对象的promise,要使用它,首先必须解析服务承诺,然后调用适当的资源类对象(我使用与Angular文档相同的术语)。获得资源类对象后,您可以请求资源并解决它。

正确的用法是:

MyTestService.then( function( responseObject ) {
  responseObject.resource.get( { websiteId : responseObject.websiteId }, function( response ) {
    console.log( response );
  })
});

另一个不同的历史是你为什么需要这个。 如果我是你,我将创建不同的资源然后嵌套承诺,以便在获得另一个之前解决一个。

但那不是你的问题。