55 */
66
77// [START maps_place_autocomplete_data_session]
8- let title ;
9- let results ;
10- let input ;
11- let token ;
8+ let titleElement ;
9+ let resultsContainerElement ;
10+ let inputElement ;
11+
12+ let newestRequestId = 0 ;
1213
1314// Add an initial request body.
14- let request = {
15- input : "" ,
15+ const request = {
16+ input : '' ,
1617 locationRestriction : { west : - 122.44 , north : 37.8 , east : - 122.39 , south : 37.78 } ,
1718 origin : { lat : 37.7893 , lng : - 122.4039 } ,
18- includedPrimaryTypes : [ " restaurant" ] ,
19- language : " en-US" ,
20- region : "us" ,
19+ includedPrimaryTypes : [ ' restaurant' ] ,
20+ language : ' en-US' ,
21+ region : 'us' ,
2122} ;
2223
23- async function init ( ) {
24- token = new google . maps . places . AutocompleteSessionToken ( ) ;
25-
26- title = document . getElementById ( 'title' ) ;
27- results = document . getElementById ( 'results' ) ;
28- input = document . querySelector ( "input" ) ;
29- input . addEventListener ( "input" , makeAcRequest ) ;
30- request = refreshToken ( request ) as any ;
24+ function init ( ) {
25+ titleElement = document . getElementById ( 'title' ) ;
26+ resultsContainerElement = document . getElementById ( 'results' ) ;
27+ inputElement = document . querySelector ( 'input' ) ;
28+ inputElement . addEventListener ( 'input' , makeAutocompleteRequest ) ;
29+ refreshToken ( request ) ;
3130}
3231
33- async function makeAcRequest ( input ) {
32+ async function makeAutocompleteRequest ( inputEvent ) {
3433 // Reset elements and exit if an empty string is received.
35- if ( input . target . value == '' ) {
36- title . innerText = '' ;
37- results . replaceChildren ( ) ;
34+ if ( inputEvent . target . value == '' ) {
35+ titleElement . innerText = '' ;
36+ resultsContainerElement . replaceChildren ( ) ;
3837 return ;
3938 }
4039
4140 // Add the latest char sequence to the request.
42- request . input = input . target . value ;
41+ request . input = inputEvent . target . value ;
42+
43+ // To avoid race conditions, store the request ID and compare after the request.
44+ const requestId = ++ newestRequestId ;
4345
4446 // Fetch autocomplete suggestions and show them in a list.
4547 // @ts -ignore
4648 const { suggestions } = await google . maps . places . AutocompleteSuggestion . fetchAutocompleteSuggestions ( request ) ;
4749
48- title . innerText = 'Query predictions for "' + request . input + '"' ;
50+ // If the request has been superseded by a newer request, do not render the output.
51+ if ( requestId !== newestRequestId ) return ;
52+
53+ titleElement . innerText = `Query predictions for "${ request . input } "` ;
4954
5055 // Clear the list first.
51- results . replaceChildren ( ) ;
56+ resultsContainerElement . replaceChildren ( ) ;
5257
5358 for ( const suggestion of suggestions ) {
5459 const placePrediction = suggestion . placePrediction ;
@@ -60,10 +65,10 @@ async function makeAcRequest(input) {
6065 } ) ;
6166 a . innerText = placePrediction ! . text . toString ( ) ;
6267
63- // Create a new list element.
68+ // Create a new list item element.
6469 const li = document . createElement ( 'li' ) ;
6570 li . appendChild ( a ) ;
66- results . appendChild ( li ) ;
71+ resultsContainerElement . appendChild ( li ) ;
6772 }
6873}
6974
@@ -72,19 +77,17 @@ async function onPlaceSelected(place) {
7277 await place . fetchFields ( {
7378 fields : [ 'displayName' , 'formattedAddress' ] ,
7479 } ) ;
75- let placeText = document . createTextNode ( place . displayName + ': ' + place . formattedAddress ) ;
76- results . replaceChildren ( placeText ) ;
77- title . innerText = 'Selected Place:' ;
78- input . value = '' ;
80+ const placeText = document . createTextNode ( ` ${ place . displayName } : ${ place . formattedAddress } ` ) ;
81+ resultsContainerElement . replaceChildren ( placeText ) ;
82+ titleElement . innerText = 'Selected Place:' ;
83+ inputElement . value = '' ;
7984 refreshToken ( request ) ;
8085}
8186
8287// Helper function to refresh the session token.
83- async function refreshToken ( request ) {
88+ function refreshToken ( request ) {
8489 // Create a new session token and add it to the request.
85- token = new google . maps . places . AutocompleteSessionToken ( ) ;
86- request . sessionToken = token ;
87- return request ;
90+ request . sessionToken = new google . maps . places . AutocompleteSessionToken ( ) ;
8891}
8992
9093declare global {
@@ -94,4 +97,4 @@ declare global {
9497 }
9598 window . init = init ;
9699// [END maps_place_autocomplete_data_session]
97- export { } ;
100+ export { } ;
0 commit comments