Add queueing to angulars $http service

前端 未结 6 1470
迷失自我
迷失自我 2020-12-07 17:24

I have a very quirky api that can only handle a single request at a time. Therefore, I need to ensure that every time a request is made, it goes into a queue, and that queue

6条回答
  •  死守一世寂寞
    2020-12-07 17:44

    Here is my solution for that: http://plnkr.co/edit/Tmjw0MCfSbBSgWRhFvcg

    The idea is: each run of service add request to queue and return promise. When request to $http is finished resolve/refuse returned promise and execute next task from queue if any.

    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;
      };
    });
    

    Looks quite simple :)

提交回复
热议问题