From 743b60f9ce8d348972a44e4b2231d99b59f3649c Mon Sep 17 00:00:00 2001 From: 1u0n <1u0n@users.noreply.github.com> Date: Sat, 8 Jul 2017 15:47:10 +0800 Subject: [PATCH 1/5] added _RequestError to handle HTTP errors in case the http call to the server fails for whatever reason, there's no way to know it failed and what happened, and _Post won't get executed. I add here _RequestError to be able to handle this case. --- src/autocomplete.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/autocomplete.ts b/src/autocomplete.ts index 904b64c..72cd1e5 100644 --- a/src/autocomplete.ts +++ b/src/autocomplete.ts @@ -48,6 +48,7 @@ interface Params { _RenderResponseItems: any; _Select: any; _Url: any; + _RequestError: any; // Internal item $AjaxTimer: number; @@ -222,7 +223,8 @@ class AutoComplete { function(response: string) { this._Render(this._Post(response)); this._Open(); - }.bind(this) + }.bind(this), + this._RequestError ); } }, @@ -494,6 +496,11 @@ class AutoComplete { } this.Input.setAttribute("data-autocomplete-old-value", this.Input.value); }, + /** + * Handle HTTP error on the request + */ + _RequestError: function(): void { + }, $AjaxTimer: null, $Cache: {}, @@ -601,7 +608,7 @@ class AutoComplete { } } - makeRequest(params: Params, callback: any): XMLHttpRequest { + makeRequest(params: Params, callback: any, callbackErr: any): XMLHttpRequest { var propertyHttpHeaders: string[] = Object.getOwnPropertyNames(params.HttpHeaders), request: XMLHttpRequest = new XMLHttpRequest(), method: string = params._HttpMethod(), @@ -628,6 +635,9 @@ class AutoComplete { params.$Cache[queryParams] = request.response; callback(request.response); } + else if (request.status >= 400) { + callbackErr(); + } }; return request; @@ -650,11 +660,11 @@ class AutoComplete { } } - cache(params: Params, callback: any): void { + cache(params: Params, callback: any, callbackErr: any): void { var response: string|undefined = params._Cache(params._Pre()); if (response === undefined) { - var request: XMLHttpRequest = AutoComplete.prototype.makeRequest(params, callback); + var request: XMLHttpRequest = AutoComplete.prototype.makeRequest(params, callback, callbackErr); AutoComplete.prototype.ajax(params, request); } else { From a5235eae70bcb89a343ac9bbc38d130b2f38f12c Mon Sep 17 00:00:00 2001 From: 1u0n <1u0n@users.noreply.github.com> Date: Wed, 12 Jul 2017 18:03:43 +0800 Subject: [PATCH 2/5] Update autocomplete.ts --- src/autocomplete.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/autocomplete.ts b/src/autocomplete.ts index 72cd1e5..bc666b2 100644 --- a/src/autocomplete.ts +++ b/src/autocomplete.ts @@ -20,6 +20,8 @@ interface Params { MinChars: number; QueryArg: string; Url: string; + RequestTimeout: number; + MaxTimeoutRetries: number; // Keyboard mapping event KeyboardMappings: { [_: string]: MappingEvent }; @@ -125,6 +127,8 @@ class AutoComplete { HttpMethod: "GET", QueryArg: "q", Url: null, + RequestTimeout: undefined, + MaxTimeoutRetries: 3, KeyboardMappings: { "Enter": { @@ -608,7 +612,7 @@ class AutoComplete { } } - makeRequest(params: Params, callback: any, callbackErr: any): XMLHttpRequest { + makeRequest(params: Params, callback: any, callbackErr: any, retryNumber:number): XMLHttpRequest { var propertyHttpHeaders: string[] = Object.getOwnPropertyNames(params.HttpHeaders), request: XMLHttpRequest = new XMLHttpRequest(), method: string = params._HttpMethod(), @@ -625,6 +629,9 @@ class AutoComplete { } request.open(method, url, true); + + if (params.RequestTimeout && (retryNumber <= params.MaxTimeoutRetries)) + request.timeout = params.RequestTimeout; for (var i = propertyHttpHeaders.length - 1; i >= 0; i--) { request.setRequestHeader(propertyHttpHeaders[i], params.HttpHeaders[propertyHttpHeaders[i]]); @@ -639,6 +646,11 @@ class AutoComplete { callbackErr(); } }; + + request.ontimeout = function() { + var retryRequest = AutoComplete.prototype.makeRequest(params, callback, callbackErr, ++retryNumber); + AutoComplete.prototype.ajax(params, retryRequest, false); + }; return request; } @@ -664,7 +676,7 @@ class AutoComplete { var response: string|undefined = params._Cache(params._Pre()); if (response === undefined) { - var request: XMLHttpRequest = AutoComplete.prototype.makeRequest(params, callback, callbackErr); + var request: XMLHttpRequest = AutoComplete.prototype.makeRequest(params, callback, callbackErr, 0); AutoComplete.prototype.ajax(params, request); } else { From ade2c94815f88a42b6968dd4d6808b8d7a71379e Mon Sep 17 00:00:00 2001 From: 1u0n <1u0n@users.noreply.github.com> Date: Wed, 12 Jul 2017 19:16:27 +0800 Subject: [PATCH 3/5] Update autocomplete.ts --- src/autocomplete.ts | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/autocomplete.ts b/src/autocomplete.ts index bc666b2..c250af8 100644 --- a/src/autocomplete.ts +++ b/src/autocomplete.ts @@ -612,7 +612,7 @@ class AutoComplete { } } - makeRequest(params: Params, callback: any, callbackErr: any, retryNumber:number): XMLHttpRequest { + makeRequest(params: Params, callback: any, callbackErr: any): XMLHttpRequest { var propertyHttpHeaders: string[] = Object.getOwnPropertyNames(params.HttpHeaders), request: XMLHttpRequest = new XMLHttpRequest(), method: string = params._HttpMethod(), @@ -647,10 +647,15 @@ class AutoComplete { } }; - request.ontimeout = function() { - var retryRequest = AutoComplete.prototype.makeRequest(params, callback, callbackErr, ++retryNumber); - AutoComplete.prototype.ajax(params, retryRequest, false); - }; + if (params.RequestTimeout) { + request.ontimeout = function() { + var retryRequest = AutoComplete.prototype.makeRequest(params, callback, callbackErr); + if (this.retries <= params.MaxTimeoutRetries) + retryRequest.timeout = params.RequestTimeout + retryRequest.retries = ++this.retries; + AutoComplete.prototype.ajax(params, retryRequest, false); + }; + } return request; } @@ -676,8 +681,13 @@ class AutoComplete { var response: string|undefined = params._Cache(params._Pre()); if (response === undefined) { - var request: XMLHttpRequest = AutoComplete.prototype.makeRequest(params, callback, callbackErr, 0); + var request: XMLHttpRequest = AutoComplete.prototype.makeRequest(params, callback, callbackErr); + if (params.RequestTimeout) { + request.timeout = params.RequestTimeout; + request.retries = 0; + } + AutoComplete.prototype.ajax(params, request); } else { callback(response); From 0ffae01717e13801e8aee0744291d866199fa6e2 Mon Sep 17 00:00:00 2001 From: 1u0n <1u0n@users.noreply.github.com> Date: Wed, 12 Jul 2017 22:54:55 +0800 Subject: [PATCH 4/5] travis test doesn't allow functions with 4 parameters. Reverting to a3d96d6 --- src/autocomplete.ts | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/src/autocomplete.ts b/src/autocomplete.ts index c250af8..72cd1e5 100644 --- a/src/autocomplete.ts +++ b/src/autocomplete.ts @@ -20,8 +20,6 @@ interface Params { MinChars: number; QueryArg: string; Url: string; - RequestTimeout: number; - MaxTimeoutRetries: number; // Keyboard mapping event KeyboardMappings: { [_: string]: MappingEvent }; @@ -127,8 +125,6 @@ class AutoComplete { HttpMethod: "GET", QueryArg: "q", Url: null, - RequestTimeout: undefined, - MaxTimeoutRetries: 3, KeyboardMappings: { "Enter": { @@ -629,9 +625,6 @@ class AutoComplete { } request.open(method, url, true); - - if (params.RequestTimeout && (retryNumber <= params.MaxTimeoutRetries)) - request.timeout = params.RequestTimeout; for (var i = propertyHttpHeaders.length - 1; i >= 0; i--) { request.setRequestHeader(propertyHttpHeaders[i], params.HttpHeaders[propertyHttpHeaders[i]]); @@ -646,16 +639,6 @@ class AutoComplete { callbackErr(); } }; - - if (params.RequestTimeout) { - request.ontimeout = function() { - var retryRequest = AutoComplete.prototype.makeRequest(params, callback, callbackErr); - if (this.retries <= params.MaxTimeoutRetries) - retryRequest.timeout = params.RequestTimeout - retryRequest.retries = ++this.retries; - AutoComplete.prototype.ajax(params, retryRequest, false); - }; - } return request; } @@ -683,11 +666,6 @@ class AutoComplete { if (response === undefined) { var request: XMLHttpRequest = AutoComplete.prototype.makeRequest(params, callback, callbackErr); - if (params.RequestTimeout) { - request.timeout = params.RequestTimeout; - request.retries = 0; - } - AutoComplete.prototype.ajax(params, request); } else { callback(response); From 4f04fc073b68ae30473bfa73391c8d22aeea4064 Mon Sep 17 00:00:00 2001 From: 1u0n <1u0n@users.noreply.github.com> Date: Thu, 31 Aug 2017 11:09:20 +0800 Subject: [PATCH 5/5] renamed _RequestError to _Error --- src/autocomplete.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/autocomplete.ts b/src/autocomplete.ts index 72cd1e5..fda3ebb 100644 --- a/src/autocomplete.ts +++ b/src/autocomplete.ts @@ -48,7 +48,7 @@ interface Params { _RenderResponseItems: any; _Select: any; _Url: any; - _RequestError: any; + _Error: any; // Internal item $AjaxTimer: number; @@ -224,7 +224,7 @@ class AutoComplete { this._Render(this._Post(response)); this._Open(); }.bind(this), - this._RequestError + this._Error ); } }, @@ -499,7 +499,7 @@ class AutoComplete { /** * Handle HTTP error on the request */ - _RequestError: function(): void { + _Error: function(): void { }, $AjaxTimer: null,