본문 바로가기
> 프로그래밍 언어/Javascript

훈훈한 Javascript (15)

by 자몽주스 2023. 9. 14.
728x90
반응형

< 섹션 4 >

9. clearInterval

setInterval() = 함수

대부분의 함수는 return 을 해준다.

함수를 실행만하고 return 을 안 해준 상태. (리턴 값 받지 않음)

리턴값을 받기 위해서 변수에 담아봄

intervalId 라는 변수

tagetDateInput 변수와 똑같은 형식인 것임.

const targetDateInput = dateForMaker();

 targetDateInput => 리턴 데이터를 여기에 담아준 것

그리고 targetDate = new Date( targetDateInput ) 이렇게 사용해줬었다.

intervalId 라는 변수에 뭐가 담겨져 있을 지

console.log 를 통해 확인해보기.

값 넣어주고 버튼 눌러줌

=> 숫자 1 나옴

=> 버튼 한 번 더 눌러주면 숫자 2 출력

누를 수록 숫자가 증가돼서 출력 됨. ( 1, 2, 3...)

setInterval 이라는 함수의 반환값은 interval의 id.

반복중인 코드의 아이디 값.

1초마다 함수가 반복실행 되는데, interval 마다 고유한 id 값을 갖게 됨

clearInterval() 함수 사용

소괄호 안에 각 인터벌의 고유한 아이디값을 넣어줌.

( ex: 1,2,3 )

3 까지 clearInterval 을 찍어주면

카운트 다운이 중지된 걸 볼 수 있다

(반복이 중지된 것)

 

clearInterval (1)

clearInterval (2) 까지 반복이 중지되지 않았던 이유 

= 총 3개의 인터벌이 실행되고 있었기 때문에

즉, 버튼 3번 누르고 있었으니까

1 이라는 인터벌 한 개

2라는 아이디 값을 가진 인터벌 한 개

3 까지

이렇게 3개가 존재하고 있었기 때문에,

 

3개가 동시에 인터벌로서 존재하고 있었던 것

=> 3개의 아이디를 모두 제거해주니까 반복이 종료.

 

clearInterval 사용해서 반복되는 Interval 삭제해주기.

setClearInterval 함수 만들어준다.

갖고있는 intervalId를 활용해서 setClearInterval 함수에서 삭제해줄 예정

버튼하나를 html 에서 더 생성해준다.

onclick 생성 - 버튼이 눌렸을 때 어떤 함수 실행해줄 건지 지정해준다.

 

버튼 두 개 서로 공유할 수 있도록,

id 를 class로 바꿔준다.

인터벌 아이디가 여러개 생성될텐데  관리하는 방법.

const 사용해서 배열하나 생성.

intervalIdArr 배열

함수가 실행될 때마다 새로운 인터벌이 실행되니까 interval id 도 계속해서 생성됨.

intervalIdArr 배열을 갖고와서

배열에 특정 데이터 넣어주는 메소드 사용.

= push

 

주어진 배열의 가장 뒷 부분에

push 소괄호 안에 들어가는 데이터를 입력해주는 것.

 

소괄호 안에 intervalId 넣어준다.

starter 함수가 시작될 때 마다,
intervalId 가 새로 생성이 될 것이고, 

intervalIdArr 배열에 해당 intervalId 값을 넣어주게 된다.

intervalIdArr 배열의 길이만큼 반복해주는 for 문을 생성

아까 푸시로 넣어준 intervalIdArr 배열 확인해보기.

카운트 다운 시작 버튼 눌러보면

인터벌 아이디 [1] 이렇게 하나 들어간 걸 확인할 수 있다.

누를 수록 더 생성되는 걸 확인 가능.

 

근데 하나씩 밖에 존재하지 않음.

타이머 초기화 버튼을 눌렀을 경우

intervalIdArr 이 정의되지 않았다고 나온다.

 

중괄호 안에서 선언된 변수(ex: intervalIdArr )는

밖으로 나가지 못함.

setClearInterval 로 활용 불가.

중괄호 밖에서 선언된 변수는 중괄호 안에서 참조 가능

intervalIdArr 이제 안에서 가져올 수 있음.

참조도 가능.

두 번 누르니까

아까와는 다르게 인터벌 아이디가 제대로 담김

 

함수 실행할 때마다 intervalIdArr 라는 빈배열을 생성해주고 있었음.

함수가 실행되면 빈 배열이 만들어지는 것.

그리고 빈 배열에 푸시해줌. 그러면 인터벌 아이디가 하나 들어가게 됨.

 

한 번 더 버튼 누르게되면 함수 다시 실행.

그 때도 intervalIdArr 변수는 똑같이 빈배열.

그리고 그 빈 배열에다가 새로운 아이디 푸시.

그리고 그 빈 배열에다가 새로운 아이디 넣어주고,

빈 배열에다가 하나 넣어준거니 값은 하나 밖에 없음.

 

이걸 반복

푸시를 통해서 각각의 아이디 값이 들어가진 모습

container.style.display = "none";
messageContainer.innerHTML = "<h3>D-Day를 입력해주세요<h3>";

이거 복사한 다음

이 쪽에 넣어준다.

타이머에 시간 입력해주고 

카운트 다운 시작한 다음, 타이머 초기화 눌러주면

메시지 자체가 사라짐.

이 부분이 컨테이너

이 container 의 display = "none" 값으로 사라지게 한다.

messageContainer 부분

D-day를 입력해주세요 라고 나오도록 했지만 나오지 않았음.

= 다시 나타나게 하는 코드를 넣어주지 않았기 때문

= flex 를 넣어준다.

= 화면에 다시 나타나게 해줌

타이머 초기화 누르면 메시지도 잘 입력되고

타이머도 초기화되는거 확인 가능.

반복 실행 중 메시지 계속 출력되는 것 확인됨.

타이머 초기화 눌러주면 반복실행 중 메시지 더 이상 출력되면 안됨.

눌러주면 더 이상 출력이 안되는 걸 확인 ( = 인터벌 자체가 삭제된 것 )

setClearInterval 함수 추가 = 이 부분 정확히 이해는 안됐음 (20:20)

 // 만약, remaining 이 0 이라면, 타이머가 종료 되었습니다. 출력
  if (remaining <= 0) {
    container.style.display = "none";
    messageContainer.innerHTML = "<h3>타이머가 종료되었습니다.</h3>";
    messageContainer.style.display = "flex";
    setClearInterval();
    return;
  } else if (isNaN(remaining)) {
    // 만약, 잘못된 날짜가 들어왔다면, 유효한 시간대가 아닙니다. 출력
    container.style.display = "none";
    messageContainer.innerHTML = "<h3>유효한 시간대가 아닙니다.</h3>";
    messageContainer.style.display = "flex";
    setClearInterval();
    return;
  }

이렇게 두 군데 추가해준다.

불필요한 함수 반복 해제.

 

setInterval 

clearInterval 헷갈림.

여기에서 새로운 카운트 다운 생성해주고 싶을 때,

바로 새로운 날짜 입력하면

이상하게 변한다.

 

이상하게 동작하는 데이터

수정해줘야함.

새로 고침하 때 마다

타이머 초기화 되는 거 수정해야함

 

 

 

728x90
반응형

'> 프로그래밍 언어 > Javascript' 카테고리의 다른 글

훈훈한 Javascript (17)  (0) 2023.09.16
훈훈한 Javascript (16)  (2) 2023.09.16
훈훈한 Javascript (14)  (0) 2023.09.12
훈훈한 Javascript (13)  (0) 2023.09.04
훈훈한 Javascript (12)  (0) 2023.09.04