const delayedColorChange = (newColor, delay, doNext) => {
setTimeout(() => {
document.body.style.backgroundColor = newColor;
doNext && doNext();
}, delay)
}
delayedColorChange('red', 1000, () => {
delayedColorChange('orange', 1000, () => {
delayedColorChange('yellow', 1000, () => {
delayedColorChange('green', 1000, () => {
delayedColorChange('blue', 1000, () => {
delayedColorChange('indigo', 1000, () => {
delayedColorChange('violet', 1000, () => {
})
})
})
})
})
})
});
setTimeout
으로 1초마다 화면이 바뀌는 코드를 작성하면const promise = new Promise((resolve, reject) => {
// 비동기 처리 성공
resolve('result')
// 비동기 처리 실패
reject('false')
}
resolve
를 반환하고 state가 fulfilled
로 변한다.reject
를 반환하고 state가 rejected
로 변한다. const fakeRequest = (url) => {
return new Promise((resolve, reject) => {
const rand = Math.random();
setTimeout(() => {
if (rand < 0.7) {
resolve('YOUR FAKE DATA HERE');
}
reject('Request Error!');
}, 1000)
})
}
fakeRequest('/dogs/1')
.then((data) => {
console.log("DONE WITH REQUEST!")
console.log('data is:', data)
})
// promise가 resolve되면 실행된다.
.catch((err) => {
console.log("OH NO!", err)
})
// promise가 reject되면 실행된다.
then
, catch
를 통해서 promise의 반환값을 출력하거나, 사용할 수 있다.fakeRequestPromise('yelp.com/api/coffee/page1')
.then((data) => {
console.log("IT WORKED!!!!!! (page1)")
console.log(data)
return fakeRequestPromise('yelp.com/api/coffee/page2')
})
// 프로미스가 성공할때만 새롭게 return되므로 아래에서 그대로 이어 쓸 수 있음
.then((data) => {
console.log("IT WORKED!!!!!! (page2)")
console.log(data)
return fakeRequestPromise('yelp.com/api/coffee/page3')
})
.then((data) => {
console.log("IT WORKED!!!!!! (page3)")
console.log(data)
})
.catch((err) => {
console.log("OH NO, A REQUEST FAILED!!!")
console.log(err)
resolve
되면, 첫번째 then
이 실행된다.then
에서 콜백으로 console.log
가 실행된다.promise
에 대한 후속처리를 바로 이어서 할 수 있다. const delayedColorChange = (color, delay) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
document.body.style.backgroundColor = color;
resolve();
}, delay)
})
}
// 매번 새로운 promise를 return하므로, then으로 바로바로 이어 후속처리를 할 수 있다.
delayedColorChange('red', 1000)
.then(() => delayedColorChange('orange', 1000))
.then(() => delayedColorChange('yellow', 1000))
.then(() => delayedColorChange('green', 1000))
.then(() => delayedColorChange('blue', 1000))
.then(() => delayedColorChange('indigo', 1000))
.then(() => delayedColorChange('violet', 1000))
then
을 사용하지 않고 마치 동기처럼 프로미스 처리결과를 반환할 수 있다.const delayedColorChange = (color, delay) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
document.body.style.backgroundColor = color;
resolve();
}, delay)
})
}
async function rainbow() {
await delayedColorChange('red', 1000)
await delayedColorChange('orange', 1000)
await delayedColorChange('yellow', 1000)
await delayedColorChange('green', 1000)
await delayedColorChange('blue', 1000)
await delayedColorChange('indigo', 1000)
await delayedColorChange('violet', 1000)
return "ALL DONE!"
// 1초마다 순차적으로 실행된다.
}
settled
-비동기 수행처리가 완료된 상태-가 될때까지 기다렸다가 settled
가 되면 실행된다.모던 자바스크립트 Deep Dive
https://www.udemy.com/course/the-web-developer-bootcamp/
https://developer.mozilla.org/ko/docs/Learn/JavaScript/Asynchronous/Async_await