我正在尝试创建一个定时循环,该循环遍历对象数组并基于每个对象中的key:value运行一个计时器。为简单起见,我仅在功能中调用了控制台日志。我需要执行的步骤是:
这里是没有任何计时器的代码:
const list = [{
item: 'Item 1',
time: 30
},
{
item: 'Item 2',
time: 25
},
{
item: 'Item 3',
time: 40
}
];
const wait = 5;
function logger(input, suffix) {
console.log(`${input} ${suffix}`)
}
function runTimer() {
logger(list[0].item, 'timer')
for (let i = 0; i < list.length; i++) {
logger(list[i].item, 'timer');
for (t = list[i].time; t > 0; t--) {
logger(t, 'seconds');
}
for (let w = wait; w > 0; w--) {
logger(w, 'secs wait')
}
}
};
runTimer();
我可以使日志顺序正确,但是我正在努力安排正确的时间,我迷失了在多个定时循环中调用setTimeouts的方法。我该怎么办?
我建议您使用链接的Promises来实现此目的。您可以从创建返回countdown
的常规Promise
函数开始:
function countdown(time, msg) {
return new Promise(resolve => {
const i = setInterval(() => {
logger(time, msg);
if (time === 0) { // the promise resolves once the time reaches 0
clearInterval(i);
resolve();
}
time--;
}, 1000);
});
}
然后您可以使用此功能将每个商品的数量与等待时间结合起来:
function runTimer () {
let p = Promise.resolve();
for (let i of list) {
p = p.then(() => countdown(i.time, i.item).then(() => countdown(wait, 'wait')));
}
p.then(() => console.log('done!'));
};
这里是完整的示例:
const list = [
{
item:'Item 1',
time:3
},
{
item:'Item 2',
time:5
},
{
item:'Item 3',
time:4
}
];
const wait = 5;
function logger(input, suffix) {
console.log(`${input} ${suffix}`)
}
function runTimer () {
let p = Promise.resolve();
for (let i of list) {
p = p.then(() => countdown(i.time, i.item).then(() => countdown(wait, 'wait')));
}
p.then(() => console.log('done!'));
};
function countdown(time, msg) {
return new Promise(resolve => {
const i = setInterval(() => {
logger(time, msg);
if (time === 0) {
clearInterval(i);
resolve();
}
time--;
}, 1000);
});
}
runTimer();
希望这会有所帮助!
const list = [ {
item:'Item 1',
time:5
},
{
item:'Item 2',
time:3
},
{
item:'Item 3',
time:6
}
];
const wait = 5;
let itemCounter = 0;
runTimer();
function runTimer() {
// Timer for each item in list
console.log(list[itemCounter].item+ " timer");
var timer = list[itemCounter].time;
var interval = setInterval(function() {
var minutes = parseInt(timer / 60, 10),
seconds = parseInt(timer % 60, 10);
minutes = minutes < 10 ? "0" + minutes : minutes;
seconds = seconds < 10 ? "0" + seconds : seconds;
console.log(minutes+ " : " +seconds);
if(timer-- <= 0) {
clearInterval(interval);
waitTimer();
}
}, 1000);
}
function waitTimer() {
// Timer for "wait time" after an Item timer is complete
var timer = wait;
console.log("Wait timer after "+list[itemCounter].item+" timer")
var interval = setInterval(function() {
var minutes = parseInt(timer / 60, 10),
seconds = parseInt(timer % 60, 10);
minutes = minutes < 10 ? "0" + minutes : minutes;
seconds = seconds < 10 ? "0" + seconds : seconds;
console.log(minutes+ " : " +seconds);
if(timer-- <= 0) {
clearInterval(interval);
itemCounter++;
if(itemCounter < list.length) {
runTimer();
}
}
}, 1000);
}