]> source.dussan.org Git - jquery-ui.git/commitdiff
Autocomplete: Move race condition logic from ajax requests to general response handle...
authorScott González <scott.gonzalez@gmail.com>
Tue, 3 Apr 2012 20:51:22 +0000 (16:51 -0400)
committerScott González <scott.gonzalez@gmail.com>
Tue, 3 Apr 2012 20:51:22 +0000 (16:51 -0400)
(cherry picked from commit 96f9c84b7b2149c6b93ac226a52065652f218e1e)

Conflicts:

tests/unit/autocomplete/autocomplete_core.js
ui/jquery.ui.autocomplete.js

tests/unit/autocomplete/autocomplete_core.js
ui/jquery.ui.autocomplete.js

index fcd835d1ac12572e98283e50b0a597ae34d45e40..84f26980f40316d2f1debb88d20079fd335e4107 100644 (file)
@@ -69,4 +69,33 @@ test( "allow form submit on enter when menu is not active", function() {
        ok( !event.isDefaultPrevented(), "default action is prevented" );
 });
 
-})(jQuery);
+asyncTest( "handle race condition", function() {
+       expect( 3 );
+       var count = 0,
+               element = $( "#autocomplete" ).autocomplete({
+               source: function( request, response ) {
+                       count++;
+                       if ( request.term.length === 1 ) {
+                               equal( count, 1, "request with 1 character is first" );
+                               setTimeout(function() {
+                                       response([ "one" ]);
+                                       setTimeout( checkResults, 1 );
+                               }, 1 );
+                               return;
+                       }
+                       equal( count, 2, "request with 2 characters is second" );
+                       response([ "two" ]);
+               }
+       });
+
+       element.autocomplete( "search", "a" );
+       element.autocomplete( "search", "ab" );
+
+       function checkResults() {
+               equal( element.autocomplete( "widget" ).find( ".ui-menu-item" ).text(), "two",
+                       "correct results displayed" );
+               start();
+       }
+});
+
+}( jQuery ) );
index 72a69fb0efb810b946f9ee5df2d6281324932bf9..5352c343231322958c694e9b3ac20649822b5dff 100644 (file)
@@ -131,9 +131,6 @@ $.widget( "ui.autocomplete", {
                                }, 150 );
                        });
                this._initSource();
-               this.response = function() {
-                       return self._response.apply( self, arguments );
-               };
                this.menu = $( "<ul></ul>" )
                        .addClass( "ui-autocomplete" )
                        .appendTo( $( this.options.appendTo || "body", doc )[0] )
@@ -268,18 +265,11 @@ $.widget( "ui.autocomplete", {
                                        url: url,
                                        data: request,
                                        dataType: "json",
-                                       context: {
-                                               autocompleteRequest: ++requestIndex
-                                       },
                                        success: function( data, status ) {
-                                               if ( this.autocompleteRequest === requestIndex ) {
-                                                       response( data );
-                                               }
+                                               response( data );
                                        },
                                        error: function() {
-                                               if ( this.autocompleteRequest === requestIndex ) {
-                                                       response( [] );
-                                               }
+                                               response( [] );
                                        }
                                });
                        };
@@ -310,10 +300,26 @@ $.widget( "ui.autocomplete", {
                this.pending++;
                this.element.addClass( "ui-autocomplete-loading" );
 
-               this.source( { term: value }, this.response );
+               this.source( { term: value }, this._response() );
+       },
+
+       _response: function() {
+               var that = this,
+                       index = ++requestIndex;
+
+               return function( content ) {
+                       if ( index === requestIndex ) {
+                               that.__response( content );
+                       }
+
+                       that.pending--;
+                       if ( !that.pending ) {
+                               that.element.removeClass( "ui-autocomplete-loading" );
+                       }
+               };
        },
 
-       _response: function( content ) {
+       __response: function( content ) {
                if ( !this.options.disabled && content && content.length ) {
                        content = this._normalize( content );
                        this._suggest( content );
@@ -321,10 +327,6 @@ $.widget( "ui.autocomplete", {
                } else {
                        this.close();
                }
-               this.pending--;
-               if ( !this.pending ) {
-                       this.element.removeClass( "ui-autocomplete-loading" );
-               }
        },
 
        close: function( event ) {