Запуск кода с другим результатом каждые 30 секунд

#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