如何按顺序动态堆叠承诺

时间:2019-07-10 13:33:18

标签: javascript promise 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内部,我称电子的desktopCapturer.getSources是异步的。然后,我将保存到文件系统,并确保保存了最大数量的屏幕截图,但是这些屏幕截图使用的是同步Nodejs操作。

1 个答案:

答案 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);
    });
});