#javascript #node.js
#javascript #node.js
Вопрос:
У меня вызваны 2 переменные var1
, и var2
:
var var1 = 'foo';
var var2 = 'bar';
Я хотел бы иметь возможность регистрировать одну из этих переменных в консоли каждые 30 секунд, при этом переменные поочередно регистрируются (вот некоторый псевдокод):
Запишите var1 в консоль
Подождите 30 секунд
Запишите var2 в консоль
Подождите 30 секунд
Повторите
Есть ли способ сделать это? Я считаю, что я должен делать что-то, связанное с setInterval
, но мое решение:
setInterval(function() {
console.log(var1);
setTimeout(() => {
console.log(var2);
}, 30000);
}, 60000);
Похоже, это не лучшее решение. Есть ли более эффективный способ сделать это?
Ответ №1:
Просто сохраняйте счетчик, который позволяет чередовать.
var counter = 0;
var var1 = "ONE!";
var var2 = "TWO!";
var frequency = 1000; //1000 is for illustration for the example
setInterval(function() {
if( counter % 2 == 0 ) {
console.log(var1);
} else {
console.log(var2);
}
}, frequency );
Ответ №2:
Вы хотите использовать setInterval
так, чтобы интервал был согласованным и не требовалось времени выполнения для определения времени для следующего асинхронного вызова.
Вы можете передать ссылку на объект в область управления, а также отследить логическое значение и перевернуть его:
setInterval(function(a){
a.bool = !a.bool
if(!a.bool){
console.log( a.var1)
return
}
console.log(a.var2)
}, 3000, {
bool : true,
var1 : 'value',
var2 : 'other value'
})
Ответ №3:
Вы могли бы использовать setTimeout
с двумя функциями, которые вызывают друг друга:
var var1 = 'foo';
var var2 = 'bar';
const log1 = () => {
console.log(var1);
setTimeout(log2, 30000)
}
const log2 = () => {
console.log(var2);
setTimeout(log1, 30000)
}
log1();
Ответ №4:
Вот более общий подход: для заданного списка значений — он будет печатать предоставленные значения в цикле вечно и будет ждать intervalMs
между каждой печатью
/**
*
* @param {Array} values - collection of values to log
* @param {Number} intervalMs - the log interval
*/
function logValuesCyclicForever(values, intervalMs = 30000) {
let index = 0;
return setInterval(() => {
console.log(values[index]);
index = (index 1) % values.length; // sets the location back to 0 when the last element is printed.
}, intervalMs);
}
var var1 = 'foo';
var var2 = 'bar';
logValuesCyclicForever([var1, var2]); // for your use case