Предполагая, что вам удалось заставить doWork()
вернуть Обещание, вы могли бы цепочка обещаний, которые возвращает каждый из этих вызовов:
let promise = Promise.resolve();
ipcRenderer.on('doWork', function (event, ...args) {
promise = promise.then(doWork);
});
Если аргументы должны быть переданыdoWork
:
let promise = Promise.resolve();
ipcRenderer.on('doWork', function (event, ...args) {
promise = promise.then(() => doWork(...args));
});
Однако осознайте, что если скорость событий выше, чем может обработать doWork
, ваша цепочка будет становиться все длиннее и длиннее.Если все эти звонки действительно должны быть сделаны, это не проблема.
Но в некоторых сценариях может быть приемлемо и более интересно пропустить вызовы и просто выполнить «последний».Если это вариант, посмотрите на одну из многих реализаций «debounce».В качестве альтернативы, вот идея пропустить вызовы, когда приходит более свежий запрос:
let promise = Promise.resolve();
let pendingArgs = null;
ipcRenderer.on('doWork', function (event, ...args) {
const isPending = pendingArgs !== null;
pendingArgs = args; // doWork should be called with the latest version of args
if (isPending) return; // There is already a pending request to doWork
promise = promise.then(() => {
const args = pendingArgs;
pendingArgs = null;
return doWork(...args);
});
});