AngularJS 1.6.5中如何判断所有$http GET请求已完成?
实现AngularJS 1.6.5中多个$http请求完成后触发函数的方案
你现在的代码是循环发起11个独立的GET请求,但没法追踪所有请求什么时候全部完成。AngularJS的$q服务里的$q.all()方法正好是为这种场景设计的——它能把多个Promise聚合起来,等所有请求都完成后再执行统一的逻辑。
下面是针对你的场景的具体实现步骤:
- 收集所有请求的Promise:
$http.get()本身会返回一个Promise对象,我们只需要在循环里把每个请求的Promise存入一个数组即可。 - 用$q.all()监听所有请求完成:把这个Promise数组传给
$q.all(),它会返回一个新的Promise。当数组里所有请求都成功完成时,这个新Promise的then回调就会触发;如果有任何一个请求失败且没被单独处理,就会触发catch回调。 - 在统一回调里执行完成逻辑:在
$q.all()的then回调中,编写你想要在所有请求完成后触发的函数。
修改后的完整代码示例:
// 记得在你的控制器/服务中注入$http和$q服务 angular.module('yourApp').controller('YourController', ['$http', '$q', function($http, $q) { // 初始化数组存储所有请求的Promise const requestPromises = []; for(let i = 0; i < 11; i++){ const url = `/api/learner_qa/${i}`; // 发起请求并将Promise存入数组,同时保留原有的成功/失败回调 const requestPromise = $http.get(url) .then(response => { console.log(response); return response; // 可选:将响应数据传递给后续的统一回调 }, error => { console.log(error); // 可选:如果不想让单个请求失败导致整体中断,这里返回resolved的Promise // return $q.resolve(error); }); requestPromises.push(requestPromise); } // 监听所有请求完成的事件 $q.all(requestPromises) .then(allResponses => { console.log('所有请求都完成了!'); // 在这里调用你需要触发的完成函数 handleAllRequestsComplete(allResponses); }) .catch(error => { console.log('至少有一个请求失败了:', error); }); // 自定义的完成后触发函数 function handleAllRequestsComplete(allResponses) { // 这里可以处理所有请求的响应数据,allResponses是按请求顺序排列的响应数组 console.log('执行完成后的操作,所有响应数据:', allResponses); } }]);
几个需要注意的细节:
- 必须确保在你的控制器或服务中注入
$q服务,否则无法使用$q.all()。 - 如果希望单个请求失败不影响整体流程,可以在该请求的错误回调中返回
$q.resolve(error),这样$q.all()会继续等待其他请求完成。 $q.all()的then回调里的allResponses数组顺序和你存入Promise的顺序完全一致,和请求实际完成的先后无关,方便你按顺序处理响应数据。
内容的提问来源于stack exchange,提问作者Shashishekhar Hasabnis
相关产品推荐
相关产品推荐

