nnnjjj123
2020-11-17 1b2c1edb61190eeb19f465ff031eaa3b2a1b8dbc
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
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);
    };
});