Optimize Anki duplicate checks (#1013)

* Move/rename functions

* Prevent overlapping calls to check addable definitions
This commit is contained in:
toasted-nutbread 2020-11-08 16:48:15 -05:00 committed by GitHub
parent 16321a1f8c
commit 6232e3efc2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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;