yzt
2023-05-26 2f70f6727314edd84d8ec2bfe3ce832803f1ea77
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
define([
    "../_base/array",
    "../Deferred",
    "../when"
], function(array, Deferred, when){
    "use strict";
 
    // module:
    //      dojo/promise/all
 
    var some = array.some;
 
    return function all(objectOrArray){
        // summary:
        //      Takes multiple promises and returns a new promise that is fulfilled
        //      when all promises have been resolved or one has been rejected.
        // description:
        //      Takes multiple promises and returns a new promise that is fulfilled
        //      when all promises have been resolved or one has been rejected. If one of
        //      the promises is rejected, the returned promise is also rejected. Canceling
        //      the returned promise will *not* cancel any passed promises.
        // objectOrArray: Object|Array?
        //      The promise will be fulfilled with a list of results if invoked with an
        //      array, or an object of results when passed an object (using the same
        //      keys). If passed neither an object or array it is resolved with an
        //      undefined value.
        // returns: dojo/promise/Promise
 
        var object, array;
        if(objectOrArray instanceof Array){
            array = objectOrArray;
        }else if(objectOrArray && typeof objectOrArray === "object"){
            object = objectOrArray;
        }
 
        var results;
        var keyLookup = [];
        if(object){
            array = [];
            for(var key in object){
                if(Object.hasOwnProperty.call(object, key)){
                    keyLookup.push(key);
                    array.push(object[key]);
                }
            }
            results = {};
        }else if(array){
            results = [];
        }
 
        if(!array || !array.length){
            return new Deferred().resolve(results);
        }
 
        var deferred = new Deferred();
        deferred.promise.always(function(){
            results = keyLookup = null;
        });
        var waiting = array.length;
        some(array, function(valueOrPromise, index){
            if(!object){
                keyLookup.push(index);
            }
            when(valueOrPromise, function(value){
                if(!deferred.isFulfilled()){
                    results[keyLookup[index]] = value;
                    if(--waiting === 0){
                        deferred.resolve(results);
                    }
                }
            }, deferred.reject);
            return deferred.isFulfilled();
        });
        return deferred.promise;    // dojo/promise/Promise
    };
});