javascript - 如何按顺序动态堆叠 Promises

标签 javascript promise electron

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

相关文章:

javascript - 显示用于网站打印的 PDF

javascript - Angular 翻译 : Child Module translatePartialLoader urlTemplate overrides the Parent Module translatePartialLoader urlTemplate

javascript - AngularJS:如何在 ng-repeat 中使用 $index

javascript - 我可以将回调转换为 promise 吗?

html - 我在 Electron 应用程序中遇到“无法加载”错误

javascript - 如何在动态创建的按钮值中插入 <br>?

Node.js:从异步子函数的回调中调用异步父函数

javascript - React axios - 尽管使用箭头函数但仍丢失此上下文

electron - Electron主进程打包后如何调试?

javascript - 如何在pouchdb中获取带有修订属性的文档?