我有一个非常古怪的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; }; });
看起来很简单:)