Merge pull request #878 from hgiesel/updateQueue

Replace `_updatingQA` with promise-based `_updatingQueue`
This commit is contained in:
Damien Elmes 2020-12-31 12:42:58 +10:00 committed by GitHub
commit 3d7b167947
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -3,17 +3,19 @@
declare var MathJax: any; declare var MathJax: any;
type Callback = () => void | Promise<void>;
var ankiPlatform = "desktop"; var ankiPlatform = "desktop";
var typeans; var typeans;
var _updatingQA = false; var _updatingQueue: Promise<void> = Promise.resolve();
var qFade = 50; var qFade = 50;
var aFade = 0; var aFade = 0;
var onUpdateHook: Array<() => void | Promise<void>>; var onUpdateHook: Array<Callback>;
var onShownHook: Array<() => void | Promise<void>>; var onShownHook: Array<Callback>;
function _runHook(arr: Array<() => void | Promise<void>>): Promise<void[]> { function _runHook(arr: Array<Callback>): Promise<void[]> {
var promises = []; var promises = [];
for (var i = 0; i < arr.length; i++) { for (var i = 0; i < arr.length; i++) {
@ -23,18 +25,16 @@ function _runHook(arr: Array<() => void | Promise<void>>): Promise<void[]> {
return Promise.all(promises); return Promise.all(promises);
} }
async function _updateQA(html, fadeTime, onupdate, onshown) { function _queueAction(action: Callback): void {
// if a request to update q/a comes in before the previous content _updatingQueue = _updatingQueue.then(action);
// has been loaded, wait a while and try again }
if (_updatingQA) {
setTimeout(function () {
_updateQA(html, fadeTime, onupdate, onshown);
}, 50);
return;
}
_updatingQA = true;
async function _updateQA(
html: string,
fadeTime: number,
onupdate: Callback,
onshown: Callback
): Promise<void> {
onUpdateHook = [onupdate]; onUpdateHook = [onupdate];
onShownHook = [onshown]; onShownHook = [onshown];
@ -67,11 +67,10 @@ async function _updateQA(html, fadeTime, onupdate, onshown) {
// and reveal when processing is done // and reveal when processing is done
await qa.fadeTo(fadeTime, 1).promise(); await qa.fadeTo(fadeTime, 1).promise();
await _runHook(onShownHook); await _runHook(onShownHook);
_updatingQA = false;
} }
function _showQuestion(q, bodyclass) { function _showQuestion(q: string, bodyclass: string): void {
_queueAction(() =>
_updateQA( _updateQA(
q, q,
qFade, qFade,
@ -88,10 +87,12 @@ function _showQuestion(q, bodyclass) {
typeans.focus(); typeans.focus();
} }
} }
)
); );
} }
function _showAnswer(a, bodyclass) { function _showAnswer(a: string, bodyclass: string): void {
_queueAction(() =>
_updateQA( _updateQA(
a, a,
aFade, aFade,
@ -108,6 +109,7 @@ function _showAnswer(a, bodyclass) {
} }
}, },
function () {} function () {}
)
); );
} }
@ -118,7 +120,7 @@ const _flagColours = {
4: "#77aaff", 4: "#77aaff",
}; };
function _drawFlag(flag) { function _drawFlag(flag: 0 | 1 | 2 | 3): void {
var elem = $("#_flag"); var elem = $("#_flag");
if (flag === 0) { if (flag === 0) {
elem.hide(); elem.hide();
@ -128,7 +130,7 @@ function _drawFlag(flag) {
elem.css("color", _flagColours[flag]); elem.css("color", _flagColours[flag]);
} }
function _drawMark(mark) { function _drawMark(mark: boolean): void {
var elem = $("#_mark"); var elem = $("#_mark");
if (!mark) { if (!mark) {
elem.hide(); elem.hide();
@ -137,13 +139,13 @@ function _drawMark(mark) {
} }
} }
function _typeAnsPress() { function _typeAnsPress(): void {
if ((window.event as KeyboardEvent).keyCode === 13) { if ((window.event as KeyboardEvent).keyCode === 13) {
pycmd("ans"); pycmd("ans");
} }
} }
function _emulateMobile(enabled: boolean) { function _emulateMobile(enabled: boolean): void {
const list = document.documentElement.classList; const list = document.documentElement.classList;
if (enabled) { if (enabled) {
list.add("mobile"); list.add("mobile");