首页 > 解决方案 > 如何将 setTimeout 编写为仅运行一次作为 javascript 中的承诺

问题描述

我有几个用户界面,可以同时运行不同的异步进程。当其中一些完成时,他们需要执行诸如刷新部分或全部 UI 之类的操作。为了避免多次运行刷新,我使用 setTimeout 函数运行刷新,因此即使从多个同时进程“触发”它也只运行一次。例如:

var runCleanupTimeout;
function runCleanupOnce() {
    if (runCleanupTimeout) clearTimeout(runCleanupTimeout);
    runCleanupTimeout = setTimeout(function () {
        refreshUI();
    }, 250);
}

我知道我也可以将回调传递给它,并将实际超时作为变量传递给函数,但我开始在稍后完成的函数中使用 Promises,我想知道如何实现诸如抽象承诺之类的东西。目前我正在使用单个计时器(因此静态值和函数调用 - 我很少在单个 UI 中需要多个这些值,但是当我这样做时,我会创建第二个变量和具有固定超时的第二个函数)

我希望能够编写一个通用的实用程序函数作为一个承诺,所以任何时候我想做一个只运行一次,我只是调用类似的东西:

utilities.runOnce('someTimerId',250).then(
    function() {
        refreshUI();
    }
);

我知道我可以改用数组/关联数组,在其中为“计时器”指定 id 并使用自定义回调类型结构。但我不完全确定这将如何在 promise.then() 结构中工作。我看到了一个使用 .bind 属性的示例,但在这种情况下找不到关于 bind() 正在做什么的好的参考。

感谢任何帮助解决这个问题。

标签: javascriptpromisesettimeout

解决方案


事实证明,Promise 不是一个好的解决方案,因为一次性运行类型的流程只有一个谨慎的解决方案


推荐阅读