-
Notifications
You must be signed in to change notification settings - Fork 1
/
merge_pool.js
100 lines (86 loc) · 2.35 KB
/
merge_pool.js
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
90
91
92
93
94
95
96
97
98
99
100
// Generated by CoffeeScript 1.6.2
(function() {
var MergePool, async, util, _log,
__slice = [].slice;
util = require('util');
async = require('async');
_log = function(text) {
return console.log("MergePool: " + text);
};
MergePool = (function() {
/*
Merge Pool
merge multi requests, process one and response all the same requests
*/
function MergePool(opt) {
if (opt == null) {
opt = {};
}
/*
constructor
> @opt:
> debug:
*/
this.pendings = {};
this.debug = !!opt.debug;
}
MergePool.prototype.run = function() {
var args, callback, done, err, exec, item, key, queue, _i,
_this = this;
key = arguments[0], exec = arguments[1], args = 4 <= arguments.length ? __slice.call(arguments, 2, _i = arguments.length - 1) : (_i = 2, []), callback = arguments[_i++];
/*
run(key,exec,args...,callback)
> @key: string()
> @exec: (args...,callback) -> void()
> @callback: (err,result) -> void()
*/
if (key == null) {
throw new Error('MergePool.run: key can not must be null');
}
if ('string' !== typeof key) {
key = key.toString();
}
if ('function' !== typeof exec) {
throw new Error('MergePool.run: exec must be a function');
}
if ('function' !== typeof callback) {
throw new Error('MergePool.run: callback must be a function');
}
item = {
callback: callback
};
queue = this.pendings[key];
if (queue != null) {
queue.push(item);
return;
}
queue = [item];
this.pendings[key] = queue;
done = function(err, result) {
delete _this.pendings[key];
if (err instanceof Object) {
Object.freeze(err);
}
if (result instanceof Object) {
Object.freeze(result);
}
return queue.forEach(function(item) {
return item.callback.call(_this, err, result);
});
};
try {
exec.apply(null, __slice.call(args).concat([done]));
} catch (_error) {
err = _error;
process.nextTick(function() {
return done(err);
});
}
};
return MergePool;
})();
module.exports = MergePool;
}).call(this);
/*
//@ sourceMappingURL=merge_pool.map
*/