Angularjs 允许可变长度参数为角度';新加坡元资源?
问题是,我需要进行多个API调用,具体如下:Angularjs 允许可变长度参数为角度';新加坡元资源?,angularjs,angular-promise,angular-resource,Angularjs,Angular Promise,Angular Resource,问题是,我需要进行多个API调用,具体如下: www.domain.com/foo/bar?token=12345 中间可能有更多的子目录,但可能会更少 我目前正在使用$resource agentApp.factory('apiFactory', function($resource) { return $resource('www.domain.com/v1/' + ':folder', { 'query': { method: 'G
www.domain.com/foo/bar?token=12345
中间可能有更多的子目录,但可能会更少
我目前正在使用$resource
agentApp.factory('apiFactory', function($resource) {
return $resource('www.domain.com/v1/' + ':folder',
{
'query': {
method: 'GET',
isArray: true
}
});
其调用方式如下:
apiFactory.query({folder: 'foo', token: '12345'}, function() {...})
apiService.query(urlStringAndQueries, booleanForIsArray).then(function(response) { ...do something with response });
apiService.query('/foo/bar?token=12345', true)
.then(function(response) { ...do something with response });
我想让它更具可扩展性,因为我需要偶尔将isArray
值更改为false
,并且URL中的子目录数量有时是未知的,因此我宁愿不使用$resource
的:token
结构,而只使用一个带字符串的结构
我是否可以创建一项服务,使我能够按如下方式拨打电话:
apiFactory.query({folder: 'foo', token: '12345'}, function() {...})
apiService.query(urlStringAndQueries, booleanForIsArray).then(function(response) { ...do something with response });
apiService.query('/foo/bar?token=12345', true)
.then(function(response) { ...do something with response });
到目前为止,我尝试了以下几点,但显然没有给出我想要的,我不确定如何让$resource真正启动API调用,我把这归结为对$resource如何工作的根本误解:
agentApp.factory('apiService', ['$resource', '$q', function ($resource, $q) {
var factory = {
query: function (urlStringAndQueries, isArray) {
return $q(
function() {
$resource('www.domain.com/v1/' + ':location', { location: urlStringAndQueries }, {
'query': {
method: 'GET',
isArray: isArray
}
});
}
)
},
return factory;
}]);
我试图称之为:
apiFactory.query({folder: 'foo', token: '12345'}, function() {...})
apiService.query(urlStringAndQueries, booleanForIsArray).then(function(response) { ...do something with response });
apiService.query('/foo/bar?token=12345', true)
.then(function(response) { ...do something with response });
非常感谢您的帮助和/或建议。
谢谢
编辑:这是我的解决方案,直到出现更通用的模式
由于$response
固有地对URL进行编码,因此我无法在外部为基本URL字符串提供额外的实体,例如foo/bar?token=12345
,因此字符(/?=)被转换为其编码的对应项。因此,在模式中分离字符串:
agentApp.factory('apiService', ['$resource', function($resource) {
var factory = {
resourceObj: function(isArray, urlStringAndQueries) {
/* urlStringAndQueries will be variadic parameters,
so we deconstruct them for use in the URL */
var location1, location2, location3, locations = [];
angular.forEach(arguments, function(path) {
locations.push(path);
});
return $resource(vapiURL + vapiVer + '/' + ':location1' + '/' + ':location2' + '/' + ':location3' + '/' + ':location4', {
location1: locations[1],
location2: locations[2],
location3: locations[3],
location4: locations[4],
}, {
'query': {
method: 'GET',
isArray: isArray
},
'save': {
method: 'POST',
isArray: isArray
}
})
}
};
return factory;
}]);
这个解决方案仍然假设有有限的路径,这并不理想,但至少很容易重用
仍然欢迎更多更好的建议:)我不明白为什么您再次从服务方法返回承诺对象,而$resource return promise本身。不要那样做 代码
agentApp.factory('apiService', ['$resource', '$q', function($resource, $q) {
var factory = {
resourceObj: function(urlStringAndQueries, isArray) {
return $resource('www.domain.com/v1/' + ':location', {
location: urlStringAndQueries
}, {
'query': {
method: 'GET',
isArray: isArray
}
});
)
}
}]);
调用factory方法,然后您将获得对资源对象的访问权,然后调用该资源对象方法的query
控制器
apiService.resourceObj('/foo/bar?token=12345', true).query()
.then(function(response) { ...do something with response });
您可以编写一个直接使用
$http
而不是$resource
的服务。谢谢@null我来试一试。谢谢@pankajparkar的帮助。您的代码目前存在一些问题-需要在服务结束时返回工厂
对象变量,正如您正确提到的那样,$resource
返回它自己的承诺,因此我们可以简单地在查询参数中编写函数。在您的帮助下,我编辑了我的答案,以反映我目前的解决方案。再次感谢。@KyleGillen如果对你有帮助的话,你可以投赞成票。。谢谢:)