【发布时间】:2021-01-30 19:00:16
【问题描述】:
如何让下面的循环在开始下一次迭代之前等待当前迭代完成?
var minute = 0
alert ("Kick Off");
var refreshIntervalId = setInterval(function() {
if (minute < 91) {
// lots of code with Ajax calls
// can take from a fraction of a second to 30 seconds to run code
// depending on conditions
} else {
clearInterval(refreshIntervalId);
}
minute++
}, 1000);
我通常在先决条件代码完成后使用函数和“.done”来执行代码。我还使用动画中的函数在动画完成后执行代码。
但是,我无法理解如何让代码等待循环迭代完成。如果我将先决条件代码放入一个函数(循环中的所有代码)然后使用 .done,则只有循环的右括号可以放在“.done”函数中 - 这显然不起作用.
谁能解决这个难题?
【问题讨论】:
-
使用异步等待
-
因此,您的问题是您的时间间隔为 1 秒,但该函数中的某些活动可能需要超过 1 秒的时间。正确的?在哪种情况下,您希望将下一个间隔的触发延迟到最后一个间隔完成?但是您仍然需要 90 次迭代,即使其中一次迭代花费的时间超过 1 秒?
-
从不再使用
alert开始,如果您需要“看到事情发生”,请使用console.log。话虽如此,如果您的代码需要 30 秒才能运行,请将其拆分为离散的步骤,然后将每个步骤设为async函数,并使用await获取其函数结果,以便 JS 调度程序可以中断执行每次它看到await并保持响应。此外,对于这样的未知运行时代码,从不使用setInterval。相反,让代码路径的最末端重新触发其代码路径,以便仅在完成后运行“下一次迭代”。 -
尼尔 W,绝对是的。大多数迭代我需要持续 1 秒,但较长的迭代是重要的,需要设置为更长的时间或等到代码完成。 .
-
当时我尝试使用变量,但没有奏效。
标签: javascript jquery loops asynchronous wait