我正在编写一个 Electron 应用程序。在渲染器进程中,有一个事件的处理。
事件可以以可能重叠的方式多次触发。因此需要堆叠并顺序处理事件实例(如果它们重叠)。
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
中,我正在调用 electron 的 desktopCapturer.getSources
,它是异步的。然后我保存到文件系统,并确保保存最大数量的屏幕截图,但这些使用同步 Nodejs 操作。
最佳答案
假设您成功地使 doWork()
返回一个 Promise,您可以链接每个调用返回的 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);
});
});
关于javascript - 如何按顺序动态堆叠 Promises,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56971880/