How to use jQuery Deferred with custom events?

后端 未结 2 1769
轮回少年
轮回少年 2020-12-24 03:43

I have two abstracted processes (e.g. managed within js objects using the revealing module pattern that do not expose their internals) that fire custom events when they comp

2条回答
  •  孤独总比滥情好
    2020-12-24 04:21

    http://jsfiddle.net/ch47n/

    I created a small plugin that creates a new jQuery.fn.when method.

    Syntax is:

    jQuery( "whatever" ).when( "event1 event2..." ).done( callback );
    

    It uses jQuery.when() extensively internally and ensures that all events have been triggered on all elements in the collection before resolving.


    Actual plugin code below:

    ( function( $ ) {
    
        $.fn.when = function( events ) {
    
            var deferred, $element, elemIndex, eventIndex;
    
            // Get the list of events
            events = events.split( /\s+/g );
    
            // We will store one deferred per event and per element
            var deferreds = [];
    
            // For each element
            for( elemIndex = 0; elemIndex < this.length; elemIndex++ ) {
                $element = $( this[ elemIndex ] );
                // For each event
                for ( eventIndex = 0; eventIndex < events.length; eventIndex++ ) {
                    // Store a Deferred...
                    deferreds.push(( deferred = $.Deferred() ));
                    // ... that is resolved when the event is fired on this element
                    $element.one( events[ eventIndex ], deferred.resolve );
                }
            }
    
            // Return a promise resolved once all events fired on all elements
            return $.when.apply( null, deferreds );
        };
    
    } )( jQuery );
    

提交回复
热议问题