define([
|
'dojo/_base/declare',
|
'dojo/_base/lang',
|
'dojo/Deferred',
|
'dstore/Memory',
|
'dstore/Trackable',
|
'dstore/QueryResults'
|
], function (declare, lang, Deferred, Memory, Trackable, QueryResults) {
|
// summary:
|
// Creates a store that wraps the delegate store's query results and total in Deferred
|
// instances. If delay is set, the Deferreds will be resolved asynchronously after delay +/-50%
|
// milliseconds to simulate network requests that may come back out of order.
|
var AsyncStore = declare(Memory, {
|
delay: 200,
|
randomizeDelay: false,
|
|
fetch: function () {
|
var actualData = this.fetchSync();
|
var actualTotal = actualData.totalLength;
|
var resultsDeferred = new Deferred();
|
var totalDeferred = new Deferred();
|
|
function resolveResults() {
|
resultsDeferred.resolve(actualData);
|
}
|
function resolveTotal() {
|
totalDeferred.resolve(actualTotal);
|
}
|
|
setTimeout(resolveTotal, this.delay * (this.randomizeDelay ? Math.random() + 0.5 : 1));
|
setTimeout(resolveResults, this.delay * (this.randomizeDelay ? Math.random() + 0.5 : 1));
|
|
return new QueryResults(resultsDeferred.promise, {
|
totalLength: totalDeferred.promise
|
});
|
},
|
|
fetchRange: function (kwArgs) {
|
// dstore/Memory#fetchRange always uses fetchSync, which we aren't extending,
|
// so we need to extend this as well.
|
|
var results = this.fetch();
|
return new QueryResults(results.then(function (data) {
|
return data.slice(kwArgs.start, kwArgs.end);
|
}), {
|
totalLength: results.then(function (data) {
|
return data.length;
|
})
|
});
|
}
|
});
|
|
var TrackableAsyncStore = declare([ AsyncStore, Trackable ]);
|
|
return function (kwArgs, Mixin) {
|
kwArgs = kwArgs || {};
|
|
if (kwArgs.data) {
|
kwArgs = lang.mixin({}, kwArgs, { data: lang.clone(kwArgs.data) });
|
}
|
|
var Ctor = Mixin ? declare([TrackableAsyncStore, Mixin]) : TrackableAsyncStore;
|
return new Ctor(kwArgs);
|
};
|
});
|