我有一个包装资源的服务。我不得不重构它以获取一个从异步调用获得的参数(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
});
});
}]);
答案 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;
}]);
主要区别是:
如何使用
由于此服务返回一个值为资源对象的promise,要使用它,首先必须解析服务承诺,然后调用适当的资源类对象(我使用与Angular文档相同的术语)。获得资源类对象后,您可以请求资源并解决它。
正确的用法是:
MyTestService.then( function( responseObject ) {
responseObject.resource.get( { websiteId : responseObject.websiteId }, function( response ) {
console.log( response );
})
});
另一个不同的历史是你为什么需要这个。 如果我是你,我将创建不同的资源然后嵌套承诺,以便在获得另一个之前解决一个。
但那不是你的问题。