diff options
author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2020-11-08 16:48:15 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-08 16:48:15 -0500 |
commit | 6232e3efc204037e25f39ec5d70f31011b042b58 (patch) | |
tree | e4861038434587bdf8401eeeb14732ba7e7c0aed /ext/mixed/js/display.js | |
parent | 16321a1f8c9902be100b01067e1593694fa51341 (diff) |
Optimize Anki duplicate checks (#1013)
* Move/rename functions
* Prevent overlapping calls to check addable definitions
Diffstat (limited to 'ext/mixed/js/display.js')
-rw-r--r-- | ext/mixed/js/display.js | 58 |
1 files changed, 35 insertions, 23 deletions
diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js index 07e4f37a..39bd7732 100644 --- a/ext/mixed/js/display.js +++ b/ext/mixed/js/display.js @@ -86,6 +86,7 @@ class Display extends EventDispatcher { this._ankiNoteBuilder = new AnkiNoteBuilder({ renderTemplate: this._renderTemplate.bind(this) }); + this._updateAdderButtonsPromise = Promise.resolve(); this.registerActions([ ['close', () => { this.onEscape(); }], @@ -892,32 +893,11 @@ class Display extends EventDispatcher { this.autoPlayAudio(); } - this._setContentTermsOrKanjiUpdateAdderButtons(token, isTerms, definitions); + this._updateAdderButtons(token, isTerms, definitions); return true; } - async _setContentTermsOrKanjiUpdateAdderButtons(token, isTerms, definitions) { - const modes = isTerms ? ['term-kanji', 'term-kana'] : ['kanji']; - let states; - try { - if (this._options.anki.checkForDuplicates) { - const noteContext = await this._getNoteContext(); - states = await this._areDefinitionsAddable(definitions, modes, noteContext); - } else { - if (!await api.isAnkiConnected()) { - throw new Error('Anki not connected'); - } - states = this._areDefinitionsAddableForcedValue(definitions, modes, true); - } - } catch (e) { - return; - } - if (this._setContentToken !== token) { return; } - - this._updateAdderButtons(states, modes); - } - _setContentExtensionUnloaded() { const errorExtensionUnloaded = document.querySelector('#error-extension-unloaded'); @@ -976,7 +956,39 @@ class Display extends EventDispatcher { this._navigationHeader.dataset.hasNext = `${!!next}`; } - _updateAdderButtons(states, modes) { + async _updateAdderButtons(token, isTerms, definitions) { + await this._updateAdderButtonsPromise; + if (this._setContentToken !== token) { return; } + + const {promise, resolve} = deferPromise(); + try { + this._updateAdderButtonsPromise = promise; + + const modes = isTerms ? ['term-kanji', 'term-kana'] : ['kanji']; + let states; + try { + if (this._options.anki.checkForDuplicates) { + const noteContext = await this._getNoteContext(); + states = await this._areDefinitionsAddable(definitions, modes, noteContext); + } else { + if (!await api.isAnkiConnected()) { + throw new Error('Anki not connected'); + } + states = this._areDefinitionsAddableForcedValue(definitions, modes, true); + } + } catch (e) { + return; + } + + if (this._setContentToken !== token) { return; } + + this._updateAdderButtons2(states, modes); + } finally { + resolve(); + } + } + + _updateAdderButtons2(states, modes) { for (let i = 0, ii = states.length; i < ii; ++i) { const infos = states[i]; let noteId = null; |