aboutsummaryrefslogtreecommitdiff
path: root/ext/mixed
diff options
context:
space:
mode:
authorsiikamiika <siikamiika@users.noreply.github.com>2020-03-02 00:39:15 +0200
committersiikamiika <siikamiika@users.noreply.github.com>2020-03-02 00:39:15 +0200
commite6e5f23cf8481db31b94c18244f404dd3374ad90 (patch)
tree40a91f96a9d6145cd73761e3aafda2b7498fb64e /ext/mixed
parent2abf46b6fa9d6c03be0d98045e111f2d8e1e41d5 (diff)
fix API calls when Backend isn't ready yet
Diffstat (limited to 'ext/mixed')
-rw-r--r--ext/mixed/js/api.js28
1 files changed, 28 insertions, 0 deletions
diff --git a/ext/mixed/js/api.js b/ext/mixed/js/api.js
index 26f4389d..fa61a1e2 100644
--- a/ext/mixed/js/api.js
+++ b/ext/mixed/js/api.js
@@ -122,6 +122,30 @@ function apiGetDefaultAnkiFieldTemplates() {
}
function _apiInvoke(action, params={}) {
+ if (!_isBackendReady) {
+ if (_isBackendReadyPromise === null) {
+ _isBackendReadyPromise = new Promise((resolve) => (_isBackendReadyResolve = resolve));
+ const checkBackendReady = async () => {
+ try {
+ if (await _apiInvokeRaw('isBackendReady')) {
+ _isBackendReady = true;
+ _isBackendReadyResolve();
+ }
+ } catch (e) {
+ // NOP
+ }
+ setTimeout(checkBackendReady, 100); // poll Backend until it responds
+ };
+ checkBackendReady();
+ }
+ return _isBackendReadyPromise.then(
+ () => _apiInvokeRaw(action, params)
+ );
+ }
+ return _apiInvokeRaw(action, params);
+}
+
+function _apiInvokeRaw(action, params={}) {
const data = {action, params};
return new Promise((resolve, reject) => {
try {
@@ -148,3 +172,7 @@ function _apiInvoke(action, params={}) {
function _apiCheckLastError() {
// NOP
}
+
+let _isBackendReady = false;
+let _isBackendReadyResolve = null;
+let _isBackendReadyPromise = null;