AngularJS服务混合$resource与$http引发Promise响应异常问题求助
解决AngularJS中$http与$resource在统一服务里的Promise兼容问题
这个问题我之前在项目里也碰到过,本质是**$http和$resource返回的对象类型不一致**导致的Promise处理冲突,咱们一步步来解决:
问题根源分析
- 当使用外部URL时,
$http.get()直接返回一个标准的Promise对象,它没有$promise属性; - 当使用内部服务时,
InternalAPI.GetListing()返回的是$resource生成的资源实例对象,真正的Promise在它的$promise属性上。
你之前的代码里:
- 控制器用
CommonAPI.GetListing().$promise时,外部URL场景下会去取Promise的$promise属性,自然得到undefined; - 去掉
.promise时,内部场景传入$q.all的是资源实例而非Promise,导致$q无法正确等待异步完成,所以$resource方法失效。
可行解决方案:统一返回标准Promise
修改CommonAPI.GetListing()方法,让它不管是调用$http还是$resource,都返回标准的Promise对象,这样控制器里就能统一处理了:
修改后的CommonAPI服务代码
function GetListing() { var externalURL = config.listingURL || ''; if(externalURL) { // $http.get()本身返回标准Promise,直接返回 return $http.get(externalURL); } else { // 返回$resource方法的$promise属性,转为标准Promise return InternalAPI.GetListing().$promise; } }
修改后的控制器代码
// 去掉.$promise,直接传入GetListing()返回的Promise $q.all([ CommonAPI.GetListing(), ... ]).then(function(res){ $scope.listing = res[0]; });
验证效果
这样修改后:
- 外部URL场景:$http返回的Promise被直接传入$q.all,正常接收响应结果;
- 内部服务场景:$resource的
$promise被返回,同样是标准Promise,$q.all能正确等待它完成,结果也能正常获取。
完全不用拆分服务,就能实现两种数据源的统一调用逻辑。
内容的提问来源于stack exchange,提问作者Dean
相关产品推荐
相关产品推荐

