【发布时间】: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