Button Click 和 Timeout 在 javascript 中调用相同的函数

Button Click and Timeout calling the same function in javascript

我正在做一个离子项目,作为这个项目的一部分,用户必须完成一个定时任务。他们必须在 15~ 秒内回答多项选择题,否则他们将无法完成任务。

我目前有一个后台超时,会在后台调用函数"evaluate",并禁用多选答案按钮。单击多项选择答案按钮之一也可以调用此函数。

是否存在边缘情况的危险,即用户在超时调用评估函数时选择按钮,导致函数被调用两次?我怎样才能避免这种情况?

您可以在评估函数中检查一个名为 "eval_running" 的变量。如果为假,则将其设置为真并继续评估。如果为真,则您 return 来自函数而无需评估。当您显示下一个任务时,您将变量重置为 false。

这将防止任何类型的竞争条件。可能发生双重执行的时间范围取决于 eval 函数在后台运行的时间。很有可能,您不必担心这一点。

这种情况下的最佳方法不是很复杂。所以超时触发器和提交按钮调用相同的 evaluate 函数。

您需要做的就是这个。在功能打开时立即禁用提交按钮,然后写任何你想做的事情。因此,如果超时先调用该函数,按钮将在执行操作之前被禁用,用户将无法再点击该按钮。如果先点击按钮,那么它会按预期进行,这里没有复杂性。

据我所知,在 Web 浏览器会话中没有办法 "race condition",主要是因为 Web 浏览器中的每个选项卡都在单个线程中运行,所以您的逻辑将在一个线程中运行单个运行循环。您可以使用这个事实来实现一个标志,指示首先发生的事情,但是(老实说)这很丑陋。

我认为最优雅的解决方案应该是使函数 evaluate 幂等,那样的话,你不关心它是否被调用多次。