gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:25:17 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com