author | ymh <ymh.work@gmail.com> |
Sat, 06 Aug 2016 21:29:33 +0700 | |
changeset 261 | 02e2396bcbbc |
parent 182 | 1bcc373adabb |
child 328 | 04e728651a48 |
permissions | -rw-r--r-- |
182
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
1 |
import Ember from 'ember'; |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
2 |
import _ from 'lodash'; |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
3 |
import store from 'corpus-common-addon/utils/store'; |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
4 |
|
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
5 |
export default Ember.Service.extend({ |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
6 |
|
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
7 |
promises: null, |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
8 |
queryRegister: null, |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
9 |
|
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
10 |
storeKeyBase: null, |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
11 |
apiPath: null, |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
12 |
resDocRoot: null, |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
13 |
|
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
14 |
processId: function(id) { return id; }, |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
15 |
|
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
16 |
getReturnDictKey: function(id) { return id; }, |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
17 |
|
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
18 |
init() { |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
19 |
this._super(...arguments); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
20 |
this.set('promises', []); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
21 |
this.set('queryRegister',{}); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
22 |
this.doQuery = _.debounce(this._doQuery,10); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
23 |
}, |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
24 |
|
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
25 |
env: function() { |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
26 |
return Ember.getOwner(this).resolveRegistration('config:environment'); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
27 |
}, |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
28 |
|
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
29 |
|
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
30 |
_getStoreKey: function(id) { |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
31 |
return this.storeKeyBase+':'+id; |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
32 |
}, |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
33 |
|
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
34 |
_doQuery: function() { |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
35 |
var queryRegister = this.get('queryRegister'); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
36 |
this.set('queryRegister', {}); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
37 |
var ids = Object.keys(queryRegister).join(','); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
38 |
if(!ids) { |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
39 |
_.each(queryRegister, (resolve_reject) => { |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
40 |
resolve_reject[0]({}); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
41 |
}); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
42 |
} |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
43 |
Ember.$.ajax({ |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
44 |
//TODO Configuration ? |
261
02e2396bcbbc
Migrate to ember 2.7 + correct jquery null context error + declare shim for popcorn (instead of silencing the JSHint error)
ymh <ymh.work@gmail.com>
parents:
182
diff
changeset
|
45 |
url: this.env().rootURL.replace(/\/$/,'') + this.apiPath +ids, |
182
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
46 |
|
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
47 |
success: (itemDoc) => { |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
48 |
_.each(queryRegister, (resolve_reject) => { |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
49 |
resolve_reject[0](itemDoc[this.resDocRoot]); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
50 |
}); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
51 |
}, |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
52 |
error: (req, status, error) => { |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
53 |
_.each(queryRegister, (resolve_reject) => { |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
54 |
resolve_reject[1](status + ':' + error); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
55 |
}); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
56 |
|
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
57 |
} |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
58 |
}); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
59 |
}, |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
60 |
|
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
61 |
// make the query for the name. |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
62 |
// return a Promise |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
63 |
queryName: function(id) { |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
64 |
var queryRegister = this.get('queryRegister'); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
65 |
return new Ember.RSVP.Promise(function(resolve, reject) { |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
66 |
queryRegister[id] = [resolve, reject]; |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
67 |
this.doQuery(this); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
68 |
}.bind(this)); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
69 |
}, |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
70 |
|
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
71 |
getName: function(id) { |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
72 |
|
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
73 |
if(!id) { |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
74 |
return new Ember.RSVP.Promise(function(resolve/*, reject*/) { |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
75 |
resolve(''); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
76 |
}); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
77 |
} |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
78 |
|
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
79 |
var objectId = this.processId(id); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
80 |
|
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
81 |
var namePromise = null; |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
82 |
|
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
83 |
var storeKey = this._getStoreKey(id); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
84 |
var name = store.get(storeKey); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
85 |
|
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
86 |
if( name !== null) { |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
87 |
namePromise = new Ember.RSVP.Promise(function(resolve/*, reject*/) { |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
88 |
resolve(name); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
89 |
}); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
90 |
} else if ( storeKey in this.get('promises')) { |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
91 |
namePromise = this.get('promises')[storeKey]; |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
92 |
} else { |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
93 |
//TODO: handle error !!! |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
94 |
namePromise = this.queryName(objectId) |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
95 |
.then(function(names) { |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
96 |
delete this.get('promises')[storeKey]; |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
97 |
return store.set(storeKey, names[this.getReturnDictKey(objectId)]); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
98 |
}.bind(this)); |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
99 |
this.get('promises')[storeKey] = namePromise; |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
100 |
} |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
101 |
return namePromise; |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
102 |
} |
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
103 |
|
1bcc373adabb
Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
104 |
}); |