4 回答
TA贡献1801条经验 获得超8个赞
发生的事情是,程序在 for 循环中竞速,并几乎立即设置了相对于 t=0s 的超时。如果你想使用 setTimeout(),你必须自己累积时间:
const data = [
{name: "Warm up", timeFormat: "00:10", time: 10},
{name: "High interval", timeFormat: "00:20", time: 20},
{name: "Low Interval", timeFormat: "00:05", time: 5},
{name: "High interval", timeFormat: "00:20", time: 20},
{name: "Low Interval", timeFormat: "00:05", time: 5},
]
function renderTimer(data) {
var timing = 0;
for (let i = 0; i < data.length; i++) {
const eachName = data[i].name;
timing += data[i].time;
setTimeout(() => {
console.log(eachName);
}, timing * 1000);
}
}
renderTimer(data);
TA贡献1839条经验 获得超15个赞
它的工作原理是await new Promise(...)在 Promise 实现之前停止当前函数
const data = [
{name: "Warm up", timeFormat: "00:10", time: 10},
{name: "High interval", timeFormat: "00:20", time: 20},
{name: "Low Interval", timeFormat: "00:05", time: 5},
{name: "High interval", timeFormat: "00:20", time: 20},
{name: "Low Interval", timeFormat: "00:05", time: 5},
]
async function renderTimer(data) {
for (let i = 0; i < data.length; i++) {
const eachName = data[i].name;
const eachTime = data[i].time;
await new Promise(res => {
setTimeout(() => {
console.log(eachName);
// resolve the promise once the log is done
res()
}, eachTime * 100)}
)
// can't arrive here until the setTimeout is finalized
}
}
renderTimer(data);
TA贡献2012条经验 获得超12个赞
您也可以像这样在递归函数中执行此操作:
const data = [
{name: "Warm up", timeFormat: "00:10", time: 10},
{name: "High interval", timeFormat: "00:20", time: 20},
{name: "Low Interval", timeFormat: "00:05", time: 5},
{name: "High interval", timeFormat: "00:20", time: 20},
{name: "Low Interval", timeFormat: "00:05", time: 5},
]
const renderTimer = (data, i = 0) => {
setTimeout(() => {
console.log(data[i].name);
// Call for next data
if(i < data.length - 1)
renderTimer(data, i + 1);
}, data[i].time * 1000);
}
renderTimer(data);
TA贡献1779条经验 获得超6个赞
你可以这样做:
const data = [
{name: "Warm up", timeFormat: "00:10", time: 10},
{name: "High interval", timeFormat: "00:20", time: 20},
{name: "Low Interval", timeFormat: "00:05", time: 5},
{name: "High interval", timeFormat: "00:20", time: 20},
{name: "Low Interval", timeFormat: "00:05", time: 5},
]
var time = 0;
function renderTimer(data) {
for (let i = 0; i < data.length; i++) {
const eachName = data[i].name;
time += data[i].time;
const eachTime = time * 1000;
setTimeout(() => {
console.log(eachName);
}, eachTime);
}
}
renderTimer(data);
添加回答
举报
