Oj, chyba piszesz coś w stylu enterprise Hello World ;) W sensie mnóstwo funkcji i zawiły flow na coś, co powinno być proste.
lampList.forEach((lamp, i) => {
if (checkIfLast(i)) {
lamp.turnBlue(i * 100 + delay);
lampList.pop();
jak robisz forEach, to wypadałoby nie zmieniać tablicy. Chociaż tutaj pewnie nic się nie stanie, bo i tak pop() usunie ostatnią wartość, więc po prostu iteracji będzie mniej. Ale jeśli twoim celem jest usunięcie ostatniej lampy z tablicy i wywołanie metody turnBlue, to po co w ogóle robisz to w forEach i na ifie? (i jeszcze niepotrzebnie dodatkową funkcję w stylu enterprise: checkIfLast(id)
) Przecież możesz tak:
lampList.pop().turnBlue(lampList.length - 1 * 100 + delay);
czyli zdejmujesz z tablicy ostatni element i wywołujesz jego metodę turnBlue.
Ogólnie ten kod jest tak zamotany, że lepiej przepisać w prostszy sposób, będzie łatwiej zlokalizować błąd.
Np. nie rozumiem, czemu przypisujesz każdemu elementowi id? Przecież możesz utworzyć divy dynamicznie:
function createLamp(id) {
const place = document.createElement('div');
document.querySelector('main').appendChild(place);
return {
place, // destructuring z ES6
.....
No i jak masz tablicę tych obiektów utworzonych przez createLamp, to nie potrzebujesz id, bo każdy element będzie miał jakiś indeks. Więc zapamiętujesz po prostu indeks ostatniego zaświeconego elementu (albo tak jak teraz robisz - zdejmujesz po prostu element).
Myślę, że tutaj mogło się coś porypać z tymi id.
Jeszcze na co warto zwrócić uwagę, to timeouty. Czy nie jest np. tak, że równocześnie wywołują się dwa timeouty, gdzie jeden zmienia kolor na czerwony, drugi na niebieski i się anulują. Ale nie wiem, czy tak jest, zgaduję tylko. Ogólnie to tych timeoutów w ogóle nie powinno być, tylko walnąć jeden setInterval, który będzie zapalał i gasił odpowiednie światełka w odpowiednim czasie i tyle (a jak zapali wszystkie, to zrobić clearInterval)