-
Notifications
You must be signed in to change notification settings - Fork 1
/
jquery.fetch.js
132 lines (108 loc) · 2.43 KB
/
jquery.fetch.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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/**
* jQuery fetch plugin v0.1
* https://github.com/toohamster/jquery-fetch
*
* @author toohamster, 2016
* @license MIT License <http://opensource.org/licenses/MIT>
*/
(function($) {
'use strict';
// 实现 异步 ajax队列,解决浏览器自身对http并发请求限制
var Queue = function(){
var items = [];
this.add = function()
{
for (var i=0;i<arguments.length;i++)
{
if (arguments[i]) items.push(arguments[i]);
}
}
this.size = function()
{
return items.length;
}
this.empty = function()
{
items = [];
}
this.next = function()
{
return items.shift();
}
};
Queue._ooid = 1000;
Queue.ooid = function(){return Queue._ooid++;}
var Fetch = function(){
this.queue = new Queue();
this.uniqueIds = {};
this.max = this.limit();
this.alives = [];
};
Fetch.prototype.checking = function()
{
if ( this.alives.length >= this.max )
{
console.log("Has reached the upper limit: " + this.max);
return false;
}
return this.execute();
}
Fetch.prototype.limit = function()
{
return 3;
}
Fetch.prototype.ajax = function(opts)
{
// uniqueId 用于替换功能
var uniqueId = opts.uniqueId ? $.trim(uniqueId) : false;
if ('' === uniqueId) uniqueId = false;
var obj = {
ooid: Queue.ooid(),
uniqueId: uniqueId,
ajax: opts
};
if ( uniqueId )
{
this.uniqueIds[ uniqueId ] = obj.ooid;
}
this.queue.add(obj);
}
Fetch.prototype.execute = function()
{
if ( this.queue.size() < 1 ) return false;
var that = this;
var task = this.queue.next();
if (task)
{
if (task.uniqueId && (this.uniqueIds[ task.uniqueId ] !== task.ooid))
{
console.log("Item has be covered: " + task.uniqueId);
return false;
}
that.alives.push(1);
var ajax = $.extend({}, task.ajax);
ajax.ooid = task.ooid;
var fn = ajax.complete;
ajax.complete = function(xhr, status)
{
if ( console.warn )
{
console.warn("ajax complete!!!: ", this.ooid);
}
that.alives.shift();
if ( console.warn )
{
console.warn("alives: %d, queue size:%d!!!: ", that.alives.length, that.queue.size());
}
if (fn)
{
fn.call(this, xhr, status);
}
}
$.ajax(ajax);
}
}
$.fetch = new Fetch();
// 加定时器
window.setInterval("$.fetch.checking()",100);
}(jQuery));