aboutsummaryrefslogtreecommitdiffstats
path: root/src/service/xhr.bulk.js
blob: fca96dde33c2ae72b06e69fb8c3151a42d29dfed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
'use strict';

/**
 * @ngdoc object
 * @name angular.module.ng.$xhr.bulk
 * @requires $xhr
 * @requires $xhr.error
 * @requires $log
 *
 * @description
 *
 * @example
 */
function $XhrBulkProvider() {
  this.$get = ['$rootScope', '$xhr', '$xhr.error', '$log',
      function( $rootScope,   $xhr,   $error,       $log) {
    var requests = [];
    function bulkXHR(method, url, post, success, error) {
      if (isFunction(post)) {
        error = success;
        success = post;
        post = null;
      }
      var currentQueue;
      forEach(bulkXHR.urls, function(queue){
        if (isFunction(queue.match) ? queue.match(url) : queue.match.exec(url)) {
          currentQueue = queue;
        }
      });
      if (currentQueue) {
        if (!currentQueue.requests) currentQueue.requests = [];
        var request = {
            method: method,
            url: url,
            data: post,
            success: success};
        if (error) request.error = error;
        currentQueue.requests.push(request);
      } else {
        $xhr(method, url, post, success, error);
      }
    }
    bulkXHR.urls = {};
    bulkXHR.flush = function(success, errorback) {
      assertArgFn(success = success || noop, 0);
      assertArgFn(errorback = errorback || noop, 1);
      forEach(bulkXHR.urls, function(queue, url) {
        var currentRequests = queue.requests;
        if (currentRequests && currentRequests.length) {
          queue.requests = [];
          queue.callbacks = [];
          $xhr('POST', url, {requests: currentRequests},
            function(code, response) {
              forEach(response, function(response, i) {
                try {
                  if (response.status == 200) {
                    (currentRequests[i].success || noop)(response.status, response.response);
                  } else if (isFunction(currentRequests[i].error)) {
                      currentRequests[i].error(response.status, response.response);
                  } else {
                    $error(currentRequests[i], response);
                  }
                } catch(e) {
                  $log.error(e);
                }
              });
              success();
            },
            function(code, response) {
              forEach(currentRequests, function(request, i) {
                try {
                  if (isFunction(request.error)) {
                    request.error(code, response);
                  } else {
                    $error(request, response);
                  }
                } catch(e) {
                  $log.error(e);
                }
              });
              noop();
            });
        }
      });
    };
    $rootScope.$watch(function() { bulkXHR.flush(); });
    return bulkXHR;
  }];
}