我正在编写一个 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/