Improve the StructTreeLayerBuilder.render method
In hindsight it occurred to me that there's a couple of smaller issues with this method after it's made asynchronous (in PR 18658). - If the `render`-method is invoked back-to-back the existing caching doesn't guarantee that re-parsing won't occur, which we can address by introducing a new (private) promise. - If there's any errors fetching and/or parsing the structTree-data, we'd attempt to parse it again on re-rendering despite that being pointless.
This commit is contained in:
parent
d3698223a8
commit
4b8628637a
@ -76,7 +76,9 @@ const HEADING_PATTERN = /^H(\d+)$/;
|
|||||||
class StructTreeLayerBuilder {
|
class StructTreeLayerBuilder {
|
||||||
#promise;
|
#promise;
|
||||||
|
|
||||||
#treeDom = undefined;
|
#treeDom = null;
|
||||||
|
|
||||||
|
#treePromise;
|
||||||
|
|
||||||
#elementAttributes = new Map();
|
#elementAttributes = new Map();
|
||||||
|
|
||||||
@ -85,13 +87,23 @@ class StructTreeLayerBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async render() {
|
async render() {
|
||||||
if (this.#treeDom !== undefined) {
|
if (this.#treePromise) {
|
||||||
return this.#treeDom;
|
return this.#treePromise;
|
||||||
|
}
|
||||||
|
const { promise, resolve, reject } = Promise.withResolvers();
|
||||||
|
this.#treePromise = promise;
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.#treeDom = this.#walk(await this.#promise);
|
||||||
|
} catch (ex) {
|
||||||
|
reject(ex);
|
||||||
}
|
}
|
||||||
const treeDom = (this.#treeDom = this.#walk(await this.#promise));
|
|
||||||
this.#promise = null;
|
this.#promise = null;
|
||||||
treeDom?.classList.add("structTree");
|
|
||||||
return treeDom;
|
this.#treeDom?.classList.add("structTree");
|
||||||
|
resolve(this.#treeDom);
|
||||||
|
|
||||||
|
return promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
async getAriaAttributes(annotationId) {
|
async getAriaAttributes(annotationId) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user