, . , , Ember-Data . , , . . , , , . , (50 ) . , . , , , , .
, , .
App.UserAdapter = DS.RESTAdapter.extend({
_findMany: null,
find: function(store, type, id) {
return this.findMany(store, type, [id]);
},
findMany: function(store, type, ids) {
this._findMany = this._super;
var resolve;
var promise = new Ember.RSVP.Promise(function(r) {
resolve = r;
});
this.concatenateRequest(store, ids, resolve);
return promise;
},
debounceTimeout: 50,
concatenateRequest: (function() {
var allIds = new Em.Set();
var allPromises = [];
var timeout = null;
var extractUsers = function(payload, ids) {
var users = payload.users.filter(function(user) {
return (ids.indexOf(user.id.toString()) >= 0);
});
return { users: users };
};
return function(store, ids, resolve) {
clearTimeout(timeout);
allIds.addObjects(ids);
allPromises.push({ ids: ids, resolve: resolve });
timeout = setTimeout(function() {
var ids = allIds.toArray();
var promises = allPromises;
allIds = new Em.Set();
allPromises = [];
this._findMany(store, ConversationApp.User, ids).then(function(payload) {
promises.forEach(function(promise) {
var users = extractUsers(payload, promise.ids);
promise.resolve(users);
});
});
}.bind(this), this.get('debounceTimeout'));
};
})()
});
EDIT: JSBin unit test , , . , , .