# HG changeset patch # User Edouard Tisserant # Date 1616074341 -3600 # Node ID cdd2a032b424ccf72abf2fbb9273f9abfd48dfc8 # Parent 26b7c4aa7b3844f3a2691e01696208cfa304b4d0 SVGHMI: JsonTable: Fixed options not being passed in JSON post when jumping to a page where additional variables are pre-defined by a HMI:VarInit. Was JS Fetch Promise not executed late enough, and gathering JsonTable variables before the sequence of calls to dispatch() was finished. diff -r 26b7c4aa7b38 -r cdd2a032b424 svghmi/gen_index_xhtml.xslt --- a/svghmi/gen_index_xhtml.xslt Wed Mar 17 11:07:29 2021 +0100 +++ b/svghmi/gen_index_xhtml.xslt Thu Mar 18 14:32:21 2021 +0100 @@ -4607,49 +4607,55 @@ </xsl:text> <xsl:text> this.abort_controller = new AbortController(); </xsl:text> - <xsl:text> const query = { -</xsl:text> - <xsl:text> args: this.args, -</xsl:text> - <xsl:text> range: this.cache[1], -</xsl:text> - <xsl:text> position: this.cache[2], -</xsl:text> - <xsl:text> visible: this.visible, -</xsl:text> - <xsl:text> extra: this.cache.slice(4), -</xsl:text> - <xsl:text> options: opt -</xsl:text> - <xsl:text> }; -</xsl:text> - <xsl:text> -</xsl:text> - <xsl:text> const options = { -</xsl:text> - <xsl:text> method: 'POST', -</xsl:text> - <xsl:text> body: JSON.stringify(query), -</xsl:text> - <xsl:text> headers: {'Content-Type': 'application/json'}, -</xsl:text> - <xsl:text> signal: this.abort_controller.signal -</xsl:text> - <xsl:text> }; -</xsl:text> - <xsl:text> -</xsl:text> - <xsl:text> return fetch(this.args[0], options) -</xsl:text> - <xsl:text> .then(this.handle_http_response_bound) -</xsl:text> - <xsl:text> .then(this.spread_json_data_bound) -</xsl:text> - <xsl:text> .catch(this.fetch_error_bound); -</xsl:text> - <xsl:text> -</xsl:text> - <xsl:text> } + <xsl:text> return Promise.resolve().then(() => { +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text> const query = { +</xsl:text> + <xsl:text> args: this.args, +</xsl:text> + <xsl:text> range: this.cache[1], +</xsl:text> + <xsl:text> position: this.cache[2], +</xsl:text> + <xsl:text> visible: this.visible, +</xsl:text> + <xsl:text> extra: this.cache.slice(4), +</xsl:text> + <xsl:text> options: opt +</xsl:text> + <xsl:text> }; +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text> const options = { +</xsl:text> + <xsl:text> method: 'POST', +</xsl:text> + <xsl:text> body: JSON.stringify(query), +</xsl:text> + <xsl:text> headers: {'Content-Type': 'application/json'}, +</xsl:text> + <xsl:text> signal: this.abort_controller.signal +</xsl:text> + <xsl:text> }; +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text> return fetch(this.args[0], options) +</xsl:text> + <xsl:text> .then(this.handle_http_response_bound) +</xsl:text> + <xsl:text> .then(this.spread_json_data_bound) +</xsl:text> + <xsl:text> .catch(this.fetch_error_bound); +</xsl:text> + <xsl:text> }); +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> </xsl:text> <xsl:text> unsub(){ </xsl:text> diff -r 26b7c4aa7b38 -r cdd2a032b424 svghmi/widget_jsontable.ysl2 --- a/svghmi/widget_jsontable.ysl2 Wed Mar 17 11:07:29 2021 +0100 +++ b/svghmi/widget_jsontable.ysl2 Thu Mar 18 14:32:21 2021 +0100 @@ -25,28 +25,31 @@ do_http_request(...opt) { this.abort_controller = new AbortController(); - const query = { - args: this.args, - range: this.cache[1], - position: this.cache[2], - visible: this.visible, - extra: this.cache.slice(4), - options: opt - }; - - const options = { - method: 'POST', - body: JSON.stringify(query), - headers: {'Content-Type': 'application/json'}, - signal: this.abort_controller.signal - }; - - return fetch(this.args[0], options) - .then(this.handle_http_response_bound) - .then(this.spread_json_data_bound) - .catch(this.fetch_error_bound); - - } + return Promise.resolve().then(() => { + + const query = { + args: this.args, + range: this.cache[1], + position: this.cache[2], + visible: this.visible, + extra: this.cache.slice(4), + options: opt + }; + + const options = { + method: 'POST', + body: JSON.stringify(query), + headers: {'Content-Type': 'application/json'}, + signal: this.abort_controller.signal + }; + + return fetch(this.args[0], options) + .then(this.handle_http_response_bound) + .then(this.spread_json_data_bound) + .catch(this.fetch_error_bound); + }); + } + unsub(){ this.abort_controller.abort(); super.unsub();