我目前正在开发一项服务,可以确定控制器从哪里获取数据(外部网址或内部服务器)。
这是我的示例代码的一部分
//Controller
$q.all([
CommonAPI.GetListing().$promise,
...
...
]).then(function(res){
$scope.listing = res[0];
});
//CommonAPI service
function GetListing() {
var externalURL = config.listingURL || '';
if(externalURL) {
return $http.get(externalURL);
} else {
return InternalAPI.GetListing(); //$resource service
}
}
//InternalAPI service
.factory(...
return $resource('Internal', {} , {
GetListing: {
method: 'GET',
url: 'internal/listing'
}
}); ...
问题是,如果没有externalURL
该功能可以使用$resource
方法正常工作,但如果有externalURL
且使用$http
方法,则回复得到undefined
。
如果我将$q
内的承诺更改为CommonAPI.GetListing()
而没有.$promise
,则可以使用$http
方法,但不能使用$resource
。
有什么方法可以解决这个问题吗?我想我可以将其拆分为2个不同的服务,1个用于$http
,1个用于$resource
,并在$q
之前进行条件检查,但我不愿意。
对此有任何帮助将不胜感激。感谢。
答案 0 :(得分:0)
您是否尝试过返回承诺而不是$http.get()
?
像:
if(externalURL) {
return new Promise((resolve, reject) => {
$http.get(externalURL)
.then(response => resolve(response))
.catch(error => reject(error));
}
}
您可以尝试的另一种方法是不使用$q.all
,而是将您的逻辑拆分为2种方法。
首先检查是否存在externalURL
,然后调用任一方法来处理数据:
if (externalURL) {
// callHTTPMethod
} else {
// call resource method
}
请注意,这样您可以更好地控制$q.all
,但需要在各自的方法中单独处理每个响应。