Я бы предложил вам использовать цепочку 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();