javascript - Javascript - 循环中的异步/等待计时器
问题描述
我正在开发“Timeblocks”类型的应用程序(用于 uni)。核心思想是我们有一个子任务列表,每个子任务都有指定的时间限制。我希望能够遍历任务,使用计时器对分配的时间进行倒计时,然后迭代到下一个任务。例如;
var todos = [
{ id: 1, task: "Finance", time: 1 },
{ id: 2, task: "Distribution", time: 1 },
{ id: 3, task: "Blah", time: 1 }
];
我们将遍历上述内容,在控制台中每个倒计时 1 分钟。
我已经对核心功能进行了编码,迭代本身与 async/await 一起工作。
堆栈闪电战:
https://stackblitz.com/edit/js-87ykxt
然而,倒计时本身在第一次迭代后不能正常工作,并且表现得很奇怪,似乎每秒倒计时两次,然后实际上从未停止并进入负数。间隔应该在每次计时器达到 0 时清除,然后在下一次迭代发生时重新创建。
任何帮助表示赞赏。
PS 还知道第一次迭代需要 1 分钟才能开始,我也必须解决这个问题!
解决方案
好吧,我会避免使用全局变量。最好将参数/值作为参数传递给函数。请使用 'let' 和 'const' 而不是 'var'!为了帮助您理解我已经缩短了您的代码并添加了一些调试行。希望现在它可以按您的意愿运行(:
// Import stylesheets
import "./style.css";
// Write Javascript code!
const start = document.getElementById("start");
start.addEventListener("click", startHandler);
var todos = [
{ id: 1, task: "Finance", time: 0.1 },
{ id: 2, task: "Distribution", time: 0.2 },
{ id: 3, task: "Blah", time: 0.2 }
];
var interval;
var mySeconds;
function tick(task, resolve) {
var min = Math.floor(mySeconds / 60);
var sec = mySeconds - min * 60;
if (sec < 10) {
sec = "0" + sec;
}
var message = min.toString() + ":" + sec;
console.log(message);
if (mySeconds === 0) {
alert("Done for " + task);
clearInterval(interval);
return resolve();
}
mySeconds--;
}
function resolveTimer(time, task) {
return new Promise(resolve => {
mySeconds = time;
interval = setInterval(tick, 1000, task, resolve);
});
}
async function startHandler() {
for (let i = 0; i < todos.length; i++) {
const time = todos[i].time;
const task = todos[i].task;
console.log("Starting for task:", task);
await resolveTimer(time * 60, task);
console.log(task, " awaited");
}
}
推荐阅读
- mysql - 在 laravel 中为每个用户保存一个关注列表
- javascript - 如何在呈现网页时检查外部窗口是否已启动或恢复(非活动)?
- mysql - 使用 Objection.js 获取所有与 throw 多个表相关的数据
- asp.net-core - 为什么我要返回到 MVC 中的 POST 方法的 Viewmodel 返回 null ViewModel
- javascript - 如何使用 jquery 重新索引数组属性名称
- installation - 无法从“lxml”导入“etree”
- maven - Micronaut Swagger 多模块
- r - R tables::tabular() 使用Format() 摆脱scientifc和round
- node.js - Nodejs hana-client 连接池示例
- python - 接受一个数组并产生下一个数字的脚本