首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何按顺序动态堆叠承诺

如何按顺序动态堆叠承诺
EN

Stack Overflow用户
提问于 2019-07-10 13:33:18
回答 1查看 113关注 0票数 1

我正在写一个电子应用程序。在呈现程序过程中,有一个事件的处理。

该事件可以多次触发,其方式是可能与重叠。因此,如果事件实例重叠,则需要对它们进行堆栈和顺序处理。

代码语言:javascript
复制
ipcRenderer.on('doWork', function (event, args) {
   doWork();
});

由于目标是防止doWork执行的重叠,因此尝试以这样的方式使其成为承诺,如果出现更多的事件,它们就会堆积起来。但我没能建立算法。

我在堆栈溢出中发现的其他问题总是关于预先定义的/已知数量的承诺(如果我错过了什么东西,很抱歉)。

编辑:问题如下:

How can I execute array of promises in sequential order?

Execute many promises sequentially (Concept)

doWork内部,我调用电子的desktopCapturer.getSources,这是异步的。然后,我将保存到文件系统,并确保保存了最大数量的屏幕截图,但这些操作使用的是同步Nodejs操作。

EN

Stack Overflow用户

回答已采纳

发布于 2019-07-10 13:46:59

假设您成功地使doWork()返回了一个承诺,那么您可以连锁每个调用返回的承诺:

代码语言:javascript
复制
let promise = Promise.resolve();
ipcRenderer.on('doWork', function (event, ...args) {
   promise = promise.then(doWork);
});

如果必须将参数传递给doWork

代码语言:javascript
复制
let promise = Promise.resolve();
ipcRenderer.on('doWork', function (event, ...args) {
   promise = promise.then(() => doWork(...args));
});

但是,要认识到,如果事件发生的速度高于doWork所能处理的速度,那么您的链就会越来越长。如果真的要打这些电话,这不是问题。

但是,在某些场景中,跳过调用,只执行“最后一次”调用可能是可以接受的,也是更有趣的。如果这是一个选项,那么就看看其中的一个“退出”实现。或者,在最近的请求出现时,可以跳过调用:

代码语言:javascript
复制
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);
    });
});
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56971880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档