Projet

Général

Profil

Paste
Télécharger (4,31 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / libraries / flexslider-2.5.0 / bower_components / jquery / src / deferred.js @ 0aee3c58

1
define([
2
        "./core",
3
        "./var/slice",
4
        "./callbacks"
5
], function( jQuery, slice ) {
6

    
7
jQuery.extend({
8

    
9
        Deferred: function( func ) {
10
                var tuples = [
11
                                // action, add listener, listener list, final state
12
                                [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
13
                                [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
14
                                [ "notify", "progress", jQuery.Callbacks("memory") ]
15
                        ],
16
                        state = "pending",
17
                        promise = {
18
                                state: function() {
19
                                        return state;
20
                                },
21
                                always: function() {
22
                                        deferred.done( arguments ).fail( arguments );
23
                                        return this;
24
                                },
25
                                then: function( /* fnDone, fnFail, fnProgress */ ) {
26
                                        var fns = arguments;
27
                                        return jQuery.Deferred(function( newDefer ) {
28
                                                jQuery.each( tuples, function( i, tuple ) {
29
                                                        var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
30
                                                        // deferred[ done | fail | progress ] for forwarding actions to newDefer
31
                                                        deferred[ tuple[1] ](function() {
32
                                                                var returned = fn && fn.apply( this, arguments );
33
                                                                if ( returned && jQuery.isFunction( returned.promise ) ) {
34
                                                                        returned.promise()
35
                                                                                .done( newDefer.resolve )
36
                                                                                .fail( newDefer.reject )
37
                                                                                .progress( newDefer.notify );
38
                                                                } else {
39
                                                                        newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
40
                                                                }
41
                                                        });
42
                                                });
43
                                                fns = null;
44
                                        }).promise();
45
                                },
46
                                // Get a promise for this deferred
47
                                // If obj is provided, the promise aspect is added to the object
48
                                promise: function( obj ) {
49
                                        return obj != null ? jQuery.extend( obj, promise ) : promise;
50
                                }
51
                        },
52
                        deferred = {};
53

    
54
                // Keep pipe for back-compat
55
                promise.pipe = promise.then;
56

    
57
                // Add list-specific methods
58
                jQuery.each( tuples, function( i, tuple ) {
59
                        var list = tuple[ 2 ],
60
                                stateString = tuple[ 3 ];
61

    
62
                        // promise[ done | fail | progress ] = list.add
63
                        promise[ tuple[1] ] = list.add;
64

    
65
                        // Handle state
66
                        if ( stateString ) {
67
                                list.add(function() {
68
                                        // state = [ resolved | rejected ]
69
                                        state = stateString;
70

    
71
                                // [ reject_list | resolve_list ].disable; progress_list.lock
72
                                }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
73
                        }
74

    
75
                        // deferred[ resolve | reject | notify ]
76
                        deferred[ tuple[0] ] = function() {
77
                                deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
78
                                return this;
79
                        };
80
                        deferred[ tuple[0] + "With" ] = list.fireWith;
81
                });
82

    
83
                // Make the deferred a promise
84
                promise.promise( deferred );
85

    
86
                // Call given func if any
87
                if ( func ) {
88
                        func.call( deferred, deferred );
89
                }
90

    
91
                // All done!
92
                return deferred;
93
        },
94

    
95
        // Deferred helper
96
        when: function( subordinate /* , ..., subordinateN */ ) {
97
                var i = 0,
98
                        resolveValues = slice.call( arguments ),
99
                        length = resolveValues.length,
100

    
101
                        // the count of uncompleted subordinates
102
                        remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
103

    
104
                        // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
105
                        deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
106

    
107
                        // Update function for both resolve and progress values
108
                        updateFunc = function( i, contexts, values ) {
109
                                return function( value ) {
110
                                        contexts[ i ] = this;
111
                                        values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
112
                                        if ( values === progressValues ) {
113
                                                deferred.notifyWith( contexts, values );
114

    
115
                                        } else if ( !(--remaining) ) {
116
                                                deferred.resolveWith( contexts, values );
117
                                        }
118
                                };
119
                        },
120

    
121
                        progressValues, progressContexts, resolveContexts;
122

    
123
                // add listeners to Deferred subordinates; treat others as resolved
124
                if ( length > 1 ) {
125
                        progressValues = new Array( length );
126
                        progressContexts = new Array( length );
127
                        resolveContexts = new Array( length );
128
                        for ( ; i < length; i++ ) {
129
                                if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
130
                                        resolveValues[ i ].promise()
131
                                                .done( updateFunc( i, resolveContexts, resolveValues ) )
132
                                                .fail( deferred.reject )
133
                                                .progress( updateFunc( i, progressContexts, progressValues ) );
134
                                } else {
135
                                        --remaining;
136
                                }
137
                        }
138
                }
139

    
140
                // if we're not waiting on anything, resolve the master
141
                if ( !remaining ) {
142
                        deferred.resolveWith( resolveContexts, resolveValues );
143
                }
144

    
145
                return deferred.promise();
146
        }
147
});
148

    
149
return jQuery;
150
});