我正在编写电子应用程序。在渲染器过程中,将对事件进行处理。
事件可以多次触发,以可能重叠的方式进行。因此,如果事件实例重叠,则需要对其进行堆叠和顺序处理。
ipcRenderer.on('doWork', function (event, args) {
doWork();
});
由于我们的目标是防止doWork
执行重叠,因此已尝试以执行它的方式使它成为Promise,如果有更多事件发生,它们就会堆积起来。但是我无法建立算法。
我在stackoverflow上发现的其他问题总是关于预定义/已知数量的Promises(对不起,如果我错过了某些事情)。
修改:类似问题:
How can I execute array of promises in sequential order?
Execute many promises sequentially (Concept)
在doWork
内部,我称电子的desktopCapturer.getSources
是异步的。然后,我将保存到文件系统,并确保保存了最大数量的屏幕截图,但是这些屏幕截图使用的是同步Nodejs操作。
答案 0 :(得分:1)
假设您成功使doWork()
返回了Promise,则可以链接这些调用中的每个返回的诺言:
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
可以处理的事件,那么您的链会越来越长。如果真的必须进行所有这些调用,那么这实际上不是问题。
但是在某些情况下,跳过呼叫并仅执行“最后一个”呼叫可能会更有趣。如果这是一个选择,请查看许多“防抖动”实现之一。另外,这是一种在最近的请求传入时跳过呼叫的想法:
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);
});
});