我有一个非常古怪的api,一次只能处理一个请求.
因此,我需要确保每次发出请求时,都会进入一个队列,并且该队列一次执行一个请求,直到它为空.
因此,我需要确保每次发出请求时,都会进入一个队列,并且该队列一次执行一个请求,直到它为空.
通常,我只是使用jQuery的内置队列,因为该站点已经在使用jQuery.但是,我不知道我可以以某种方式装饰$http服务,或者将其包装在另一个服务中,一次返回一个承诺,或者其他服务.
这是我的解决方案:
http://plnkr.co/edit/Tmjw0MCfSbBSgWRhFvcg
想法是:每次运行服务添加请求队列并返回承诺.当请求$http完成解析/拒绝返回承诺并从队列执行下一个任务(如果有的话).
- app.factory('srv',function($q,$http) {
- var queue=[];
- var execNext = function() {
- var task = queue[0];
- $http(task.c).then(function(data) {
- queue.shift();
- task.d.resolve(data);
- if (queue.length>0) execNext();
- },function(err) {
- queue.shift();
- task.d.reject(err);
- if (queue.length>0) execNext();
- })
- ;
- };
- return function(config) {
- var d = $q.defer();
- queue.push({c:config,d:d});
- if (queue.length===1) execNext();
- return d.promise;
- };
- });
看起来很简单:)