This repository was archived by the owner on Sep 6, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbarrier.js
More file actions
93 lines (81 loc) · 2.38 KB
/
barrier.js
File metadata and controls
93 lines (81 loc) · 2.38 KB
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
/*globals Ext, SWorks */
/*jslint glovar: true, undef: true, browser: true */
/*
* barrier = new Barrier({
* timeout: 30000, // 30sec
* waitsFor: [
* { event: 'load', sender: closedAccounts.store },
* { event: 'load', sender: openAccounts.store },
* { event: 'complete', sender: anotherBarrier },
* ],
* callback: function(barrier, events) {
* // events is an array with the data from the events received and their senders
* console.dir(events);
* },
* scope: this
* });
*/
Ext.namespace('SWorks');
SWorks.Barrier = function(opts) {
Ext.apply(this, opts);
this.addEvents('complete', 'expired');
this.eventData = [];
if (this.waitsFor) {
this.expectedEvents = this.waitsFor.length;
for(var i=0;i<this.waitsFor.length;i++) {
var item = this.waitsFor[i];
item.self = this;
item.sender.on(item.event, this.eventReceiver, item, {single:true});
}
} else {
// Use createCondition
this.expectedEvents = 0;
}
setTimeout(this.onBarrierExpired.createDelegate(this), this.timeout);
}
Ext.extend(SWorks.Barrier, Ext.util.Observable, {
timeout: 30000, // 30sec
callback: Ext.emptyFn,
eventReceiver: function() {
var item = this;
item.self.handleCondition({
sender: item.sender,
event: item.event,
args: Array.prototype.slice.call(arguments, 0)
});
},
handleCondition: function(data) {
this.eventData.push(data);
this.checkBarrier();
},
checkBarrier: function() {
if (this.eventData.length == this.expectedEvents) {
this.complete = true;
this.callback.call(this.scope || this, true, this.eventData);
this.fireEvent('complete', this, this.eventData);
}
},
onBarrierExpired: function() {
if(!this.complete) {
if (this.waitsFor) {
for(var i=0;i<this.waitsFor.length;i++) {
var item = this.waitsFor[i];
item.sender.un(item.event, this.eventReceiver, item);
}
}
this.callback.call(this.scope || this, false, this.eventData);
this.fireEvent('expired', this);
}
},
createCondition: function() {
var self = this;
this.expectedEvents++;
return {
complete: function() {
self.handleCondition({
args: Array.prototype.slice.call(arguments, 0)
});
}
};
}
});