3

Почему не работает данная функция? Можно ли обойтись без цикла, для вывода по интервалам?

var i
function go() {
  var poem = 'Ночь, улица, фонарь, !!! аптека,* Бессмысленный и тусклый свет.* Живи еще !!! хоть четверть века -* Все будет так. Исхода !!! нет.* Умрешь - начнешь опять сначала* И повторится !!! все, как встарь:* Ночь, ледяная !!! рябь канала,* Аптека, улица, !!! фонарь.*';
  poem = poem.replace(/!!!/g, ' ');
  var arr = poem.split('*');
  for (i = 0; i < arr.length; i++) {
    setInterval(function(){alert(arr[i])}, 3000);
  }
}

go()

1 Answers1

0

Функция не работает, потому что к моменту выполнения даже самого первого колбэка setInterval-a переменная i равна arr.length. Не говоря уже о том, что запускается множество таймеров.

function go() {
  var poem = 'Ночь, улица, фонарь, !!! аптека,* Бессмысленный и тусклый свет.* Живи еще !!! хоть четверть века -* Все будет так. Исхода !!! нет.* Умрешь - начнешь опять сначала* И повторится !!! все, как встарь:* Ночь, ледяная !!! рябь канала,* Аптека, улица, !!! фонарь.*';
  poem = poem.replace(/!!!/g, ' ');
  var arr = poem.split('*');
  var i = 0;
  var timer = setInterval(function() {
    if (i >= arr.length) {
      clearInterval(timer);
      console.log("The end.");
    } else {
      console.log(i + ": " + arr[i++]);
    }
  }, 1000);
}

go();

с циклом:

function go() {
  var poem = 'Ночь, улица, фонарь, !!! аптека,* Бессмысленный и тусклый свет.* Живи еще !!! хоть четверть века -* Все будет так. Исхода !!! нет.* Умрешь - начнешь опять сначала* И повторится !!! все, как встарь:* Ночь, ледяная !!! рябь канала,* Аптека, улица, !!! фонарь.*';
  poem = poem.replace(/!!!/g, ' ');
  var arr = poem.split('*');
  for (var i = 0; i < arr.length; i++) {
    setTimeout((function(index){ 
      return function() {
        console.log(index + ": " + arr[index])
      };
    })(i), 1000 * (i + 1))
  }
}

go();