주어진 Tree 클래스에 DFSelect 메소드를 구현하세요.
예시
let root1 = new Tree(1); let branch2 = root1.addChild(2); let branch3 = root1.addChild(3); let leaf4 = branch2.addChild(4); let leaf5 = branch2.addChild(5); let leaf6 = branch3.addChild(6); let leaf7 = branch3.addChild(7); root1.DFSelect(function (value, depth) { return value % 2; }); // [1, 5, 3, 7] root1.DFSelect(function (value, depth) { return depth === 1; }); // [2, 3]
아직도 재귀는 너무 어렵다...
어제와 오늘은 promise강의에서 배운 것을 바탕으로 실습을 해보는 스프린트를 진행했다.
part1에서는 비동기함수를 사용하는 방법을 배웠는데 callback방식과 promise 그리고 가장 최근에 나온 async/await방식을 각각 사용해서 비동기함수를 사용해봤다.
const delay = (wait, callback) => {
setTimeout(callback, wait);
}
wait
와 callback
이라는 파라미터를 받는 delay
라는 함수를 만든다. delay
라는 함수 내에는 setTimeout
함수가 실행되고 파라미터로 받은 callback
함수를 파라미터로 받은 wait
시간만큼 지연 후 실행시키게 된다. 이 함수를 이용해서 비동기 함수를 사용해 보면 아래와 같다
function runCallback() {
resetTitle(); //1
playVideo(); //1
delay(1000, () => {
pauseVideo(); //2
displayTitle(); //2
delay(500, () => {
highlightTitle(); //3
delay(2000, resetTitle);
});
});
}
runCallback
함수는 우선 resetTitle
와 playVideo
함수(1)를 실행하게 되고 delay
함수에 wait
파라미터로 1000ms(1초), 그리고 callback
으로 pauseVideo
displayTitle
함수(2)를 받는다. 그럼 이 함수들은 위에 선언되었던 delay
함수에 의해 1000ms(1초)후에 실행되게 된다. 그리고 그 뒤에 실행된 delay
함수에 의해 highlightTitle
함수(3)를 500ms(0.5초)지연 후에 실행하게 되고 그 뒤의 delay
함수에 의해 2000ms(2초)뒤에 resetTitle
를 실행하게 된다.
const sleep = (wait) => {
return new Promise((resolve) => {
setTimeout(resolve, wait);
});
}
wait
라는 파라미터를 받는 sleep
함수는 새로운 promise인스턴스를 생성하고 그 promise인스턴스는 resolve파라미터를 통해 setTimeout
을 실행한다. setTimeout
은 resolve파라미터로 들어온 함수를 wait
만큼 지연 후 실행시키게 된다.
function runPromise() {
resetTitle();
playVideo();
sleep(1000)
.then(() => {
pauseVideo();
displayTitle();
})
.then(sleep.bind(null, 500))
.then(highlightTitle)
.then(sleep.bind(null, 2000))
.then(resetTitle);
}
promise는 resolve를 통해 fullfilled(이행, 완료)상태가 되면 .then
을 통해 결과값을 받을 수 있다.
그래서 callback방식을 promise방식으로 바꿔보면 위의 코드와 같다
runPromise
함수는 resetTitle
와playVideo
함수를 실행하고 1000ms(1초) 지연 후 pauseVideo
와displayTitle
함수를 실행시키게 된다.
그 후 .then(sleep.bind(null, 500))
코드는 500ms(0.5초)의 지연 시간 후 highlightTitle
함수를 실행시키고 2000ms(2초)의 지연 후 resetTitle
함수를 실행하게 된다.
Async/await방식은 promise객체를 조금 더 보기편하게(?) 사용할 수 있는 방법이다.
const sleep = (wait) => {
return new Promise((resolve) => {
setTimeout(resolve, wait);
});
}
async function runAsync() {
resetTitle();
playVideo();
await sleep(1000);
pauseVideo();
displayTitle();
await sleep(500);
highlightTitle();
await sleep(2000);
resetTitle();
}
다른점은 function 앞에 async키워드를 붙여주고 .then
대신 await
를 사용해서 비동기함수를 동기함수처럼 사용한다.
프로미스는 자바스크립트에서 비동기 처리에 사용되는 객체이다.
new promise()
를 통해 프로미스 인스턴스를 생성할 수 있으며 프로미스는 세가지 상태를 가진다.
.then()
을 통해 결과 값을 받을 수 있다..catch()
를 통해 실패한 이유(실패 처리의 결과 값)을 받을 수 있다.프로미스는 new promise()
를 통해 호출 할 때 콜백함수를 받을 수 있는데, 콜백함수의 인자는 resolve
와 reject
이다. resolve
가 실행 되게 되면 프로미스의 상태가 대기(pending)상태에서 이행(fulfilled)상태로 바뀌고 .then()
을 통해 결과 값을 받을 수 있다. 그리고 반대로 reject
가 실행되게 되면 프로미스의 상태가 대기(pending)상태에서 거부(rejected)상태로 바뀌고 실패한 이유를 .catch()
로 받을 수 있다.
프로미스의 처리 흐름은 위와 같다 출처:MDN