Самый простой способ дождаться действия перед выполнением кода - использовать обещания или прослушиватели событий (или оба). Например:
var resolves = [];
document.querySelector("#start").addEventListener("click", doActions);
document.querySelector("#stop-wait").addEventListener("click", function() {
resolves.forEach(function(resolve) {
resolve();
});
resolves = [];
});
function waitButtonClick() {
return new Promise(function(resolve) {
resolves.push(resolve);
});
}
function doActions() {
console.log("Step 1");
waitButtonClick().then(function() {
console.log("Step 2");
});
}
<button id="start">Start Actions</button>
<button id="stop-wait">Stop waiting</button>
То же самое можно сделать, используя await
и async
:
var resolves = [];
document.querySelector("#start").addEventListener("click", doActions);
document.querySelector("#stop-wait").addEventListener("click", function() {
resolves.forEach(function(resolve) {
resolve();
});
resolves = [];
});
function waitButtonClick() {
return new Promise(function(resolve) {
resolves.push(resolve);
});
}
async function doActions() {
console.log("Step 1");
await waitButtonClick();
console.log("Step 2");
}
<button id="start">Start Actions</button>
<button id="stop-wait">Stop waiting</button>
Promise
, async
и await
реализованы только в современных браузерах и узлах (что должно соответствовать вашему случаю, поскольку вы используя электрон). Если вы также хотите поддерживать IE, вы можете создать пользовательский Promise
polyfill:
if (typeof window["Promise"] !== "function") {
window["Promise"] = function(callBack) {
var catchList = [];
var thenList = [];
this.then = function(callBack) {
if (typeof callBack === "function") thenList.push(callBack);
return this;
};
this.catch = function(callBack) {
if (typeof callBack === "function") catchList.push(callBack);
return this;
};
function resolve(result) {
thenList.forEach(function(callBack) {
callBack(result);
});
};
function reject(error) {
catchList.forEach(function(callBack) {
callBack(error);
});
};
callBack(resolve, reject);
};
}