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,47 +67,49 @@ 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 {
_updateQA( _queueAction(() =>
q, _updateQA(
qFade, q,
function () { qFade,
// return to top of window function () {
window.scrollTo(0, 0); // return to top of window
window.scrollTo(0, 0);
document.body.className = bodyclass; document.body.className = bodyclass;
}, },
function () { function () {
// focus typing area if visible // focus typing area if visible
typeans = document.getElementById("typeans"); typeans = document.getElementById("typeans");
if (typeans) { if (typeans) {
typeans.focus(); typeans.focus();
}
} }
} )
); );
} }
function _showAnswer(a, bodyclass) { function _showAnswer(a: string, bodyclass: string): void {
_updateQA( _queueAction(() =>
a, _updateQA(
aFade, a,
function () { aFade,
if (bodyclass) { function () {
// when previewing if (bodyclass) {
document.body.className = bodyclass; // when previewing
} document.body.className = bodyclass;
}
// scroll to answer? // scroll to answer?
var e = $("#answer"); var e = $("#answer");
if (e[0]) { if (e[0]) {
e[0].scrollIntoView(); e[0].scrollIntoView();
} }
}, },
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");