Skip to content

Commit 9e00e00

Browse files
committed
Autocomplete: Scope race condition handling to the instance. Fixes #9334 - Autocomplete: Multiple instances should be able to start asynchronous requests simultaneously.
1 parent d65cc93 commit 9e00e00

File tree

2 files changed

+41
-16
lines changed

2 files changed

+41
-16
lines changed

tests/unit/autocomplete/autocomplete_core.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,34 @@ asyncTest( "handle race condition", function() {
192192
}
193193
});
194194

195+
asyncTest( "simultaneous searches (#9334)", function() {
196+
expect( 2 );
197+
var element = $( "#autocomplete" ).autocomplete({
198+
source: function( request, response ) {
199+
setTimeout(function() {
200+
response([ request.term ]);
201+
});
202+
},
203+
response: function() {
204+
ok( true, "response from first instance" );
205+
}
206+
}),
207+
element2 = $( "#autocomplete-textarea" ).autocomplete({
208+
source: function( request, response ) {
209+
setTimeout(function() {
210+
response([ request.term ]);
211+
});
212+
},
213+
response: function() {
214+
ok( true, "response from second instance" );
215+
start();
216+
}
217+
});
218+
219+
element.autocomplete( "search", "test" );
220+
element2.autocomplete( "search", "test" );
221+
});
222+
195223
test( "ARIA", function() {
196224
expect( 7 );
197225
var element = $( "#autocomplete" ).autocomplete({

ui/jquery.ui.autocomplete.js

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ $.widget( "ui.autocomplete", {
4141
select: null
4242
},
4343

44+
requestIndex: 0,
4445
pending: 0,
4546

4647
_create: function() {
@@ -414,24 +415,20 @@ $.widget( "ui.autocomplete", {
414415
this.source( { term: value }, this._response() );
415416
},
416417

417-
_response: (function() {
418-
var requestIndex = 0;
418+
_response: function() {
419+
var index = ++this.requestIndex;
419420

420-
return function() {
421-
var index = ++requestIndex;
422-
423-
return $.proxy(function( content ) {
424-
if ( index === requestIndex ) {
425-
this.__response( content );
426-
}
421+
return $.proxy(function( content ) {
422+
if ( index === this.requestIndex ) {
423+
this.__response( content );
424+
}
427425

428-
this.pending--;
429-
if ( !this.pending ) {
430-
this.element.removeClass( "ui-autocomplete-loading" );
431-
}
432-
}, this );
433-
};
434-
})(),
426+
this.pending--;
427+
if ( !this.pending ) {
428+
this.element.removeClass( "ui-autocomplete-loading" );
429+
}
430+
}, this );
431+
},
435432

436433
__response: function( content ) {
437434
if ( content ) {

0 commit comments

Comments
 (0)