Функция возвращает undefined и прерывает таймер (setTimeout)
Есть следующий код: раз в 500 мс происходит вывод случайного числа. Число не должно повторяться. Сделала проверку повтора в функции color() и если произошел повтор, вызвать функцию снова.
Проблема в том, что функция color() возвращает undefined после того, как встретила повтор в массиве already и прерывает таймер, не выводя все числа.
let already = [];
let A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
function random() {
return A[Math.floor(Math.random() * A.length)];
}
function color() {
let square = random();
if (already.length >= A.length) {
return false;
}
if (already.indexOf(square) === -1) {
already.push(square);
console.log(square);
return true;
}
color();
}
(function tick() {
let t = setTimeout(function() {
let f = color();
if (!f) {
clearTimeout(t);
} else {
tick();
}
}, 500);
})();
Ответы (3 шт):
Автор решения: Igor
→ Ссылка
function color() {
let square = random();
if (already.length >= A.length) {
return false;
}
if (already.indexOf(square) === -1) {
already.push(square);
console.log(square);
return true;
}
return color(); // !!!
}
Автор решения: vsemozhetbyt
→ Ссылка
Полагаю, ошибка в том, что в месте рекурсивного вызова не возвращается значение. Вместо color(); нужно return color();
Автор решения: Yumie
→ Ссылка
Как я поняла проблема была в следующем:
- Вызывается функция tick()
- Вызывается функция color() из функции tick()
- Не попадая ни в одно из условий, вызывается функция color() из функции color() и возвращает какой-то результат в функцию color(), из которой была вызвана.
- Функция color(), которая была вызвана из функции tick(), дальнейших инструкций не имеет и возвращает undefined.