【问题标题】:How to write setTimeout to run-only-once as a promise in javascript如何将 setTimeout 编写为仅运行一次作为 javascript 中的承诺
【发布时间】:2019-12-06 17:04:48
【问题描述】:

我有几个用户界面可以同时运行不同的异步进程。当其中一些完成时,他们需要执行诸如刷新部分或全部 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() 正在做什么的良好参考。

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

【问题讨论】:

  • 如果有人知道 [identical] 函数代码是否“可测试”相等,那么我可以自动生成一个 ID 或基于回调函数重置活动计时器。例如单步执行任何活动计时器,如果回调函数 = 计时器函数,则重置该计时器。 (不过我可以自己测试)
  • .bind 可能是Function.prototype.bind,promise 在这里是错误的工具
  • 不,你不能对函数进行相等检查。一个函数只等于它自己
  • 好的,我想可能是这样。我看到的绑定在 stackoverflow:#39538473 中,并且似乎将它绑定到一个对象。我也希望能够从对象方法内部调用这样的东西,所以我认为它可能是相关的。
  • 现在我想多了,我不认为使用 Promise 会有帮助,因为它是一个设置并忘记它类型的函数调用。在另一个地方的另一个调用中重置计时器会影响最初的承诺。

标签: javascript promise settimeout


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-08-26
    • 2017-10-04
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    相关资源
    最近更新 更多