javascript - 如何让 Javascript 循环在开始下一个迭代之前等待现有迭代完成?
问题描述
如何让下面的循环在开始下一次迭代之前等待当前迭代完成?
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”函数中 - 这显然不起作用.
谁能解决这个难题?
解决方案
您可以在异步函数中创建一个 while 循环并使用 await。在下面的代码中,while 循环在每次迭代时至少等待 2 秒,但最多与任务所需的时间一样长。
const sleep = time => new Promise(resolve => setTimeout(resolve, time))
async function main() {
while (true) {
console.log("new iteration")
const task = new Promise((resolve, reject) => {
// things that take long go here…
const duration = Math.random()*4000
setTimeout(() => {
console.log(`done, task took ${Math.round(duration)}ms`)
resolve()
}, duration)
})
// wait until task is finished but at least 2 seconds
await Promise.all([task, sleep(2000)])
}
}
main()
推荐阅读
- android - 在 github 操作工作流中下载操作存储库“r0adkll/sign-android-release@v1”时出错
- comments - 我的 Stata do 文件中有多少行代码,不包括注释?
- c - 如何正确遍历命令行参数以检查每个字符是否是 C 中的数字?
- c# - 将类中的属性列表与字符串列表匹配
- javascript - 每当有人从计算机中选择文件时,如何自动将图像重新缩放为 12 x 12
- python - 使用 Python 的 librosa 遍历音频文件
- ios - 如何通过 Stripe 直接向用户付款?
- angular - 通过复选框执行发送操作并在 Angular 9 中阻止它
- android - 调试模式和发布模式下的 Flutter 构建版本代码不一样
- python - 使用 selenium python 获取href里面的内容