๐Ÿ“ŒLanguage/JavaScript

TIL) Callback์„ ์™œ ํ•ด์•ผํ•˜๋Š”์ง€, Promise๊ฐ€ ์ƒ๊ฒจ๋‚œ ๋ฐฐ๊ฒฝ, Callback ํ•จ์ˆ˜๋ฅผ Promiseํ•จ์ˆ˜๋กœ ๋ฐ”๊ฟ”๋ณด๊ธฐ

hellohailie 2022. 6. 4. 13:48

 

๐Ÿ‘‡ ์šฐ๋ฆฌ๊ฐ€ ์ฝœ๋ฐฑ์„ ํ•ด์•ผํ•˜๋Š” ์ด์œ 

 

๋ฐ˜๋ณตํ•ด์•ผํ• ๋•Œ๋งˆ๋‹ค ๊ฐ™์€ ์‹์„ ์—ฌ๋Ÿฌ๋ฒˆ ์จ์•ผํ•œ๋‹ค. 

setTimeout(() => {
	document.body.style.backgroundColor = 'red';
}, 1000)

setTimeout(() => {
	document.body.style.backgroundColor = 'orange';
}, 2000)

setTimeout(() => {
	document.body.style.backgroundColor = 'yellow';
}, 3000)

setTimeout(() => {
	document.body.style.backgroundColor = 'green';
}, 4000)

setTimeout(() => {
	document.body.style.backgroundColor = 'blue';
}, 5000)

 

๐Ÿ‘‡ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์“ฐ๊ณ  ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. 

์ฒซ๋ฒˆ์งธ์˜ 1์ดˆ ํ›„, ๋‘๋ฒˆ์งธ์˜ 1์ดˆ ํ›„ ์ด๋Ÿฐ์‹์œผ๋กœ ์ž๋™์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ํ•„์š”ํ•ด! 

์ค‘์ฒฉ์„ ํ™œ์šฉํ•ด์„œ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

 

setTimeout(() => {
	document.body.style.backgroundColor = 'red';
    setTimeout(() => {
		document.body.style.backgroundColor = 'orange';
        	setTimeout(() => {
				document.body.style.backgroundColor = 'yellow';
                	setTimeout(() => {
						document.body.style.backgroundColor = 'green';
                        	setTimeout(() => {
							document.body.style.backgroundColor = 'blue';
					}, 1000)
				}, 1000)
		}, 1000)
	}, 1000)
}, 1000)

 

๐Ÿ‘‡ ์ผ๋˜ ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ณ , ๋‹ค๋ฅธ ํšจ๊ณผ๋ฅผ ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด!

 

์ถ”๊ฐ€๊ณต๋ถ€ setTimeout ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ 

2022.05.28 - [JavaScript] - TIL) ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ์™€ setTimeout

 

const delayedColorChange = (newColor,delay,doNext) => {
	setTimeout(() => {
    	document.body.style.backgroundColor = newColor;
        doNext();
    }, delay)
}

delayedColorChange('red',1000,() => {
	delayedColorChange('orange',1000,() => {
    	delayedColorChange('yellow',1000,() => {
        	delayedColorChange('green',1000,() => {
                delayedColorChange('blue',1000,() => {
        		})
        	})
        })
    })
});

 

 

 

๐Ÿ‘‡ ์‹œ๊ฐ„์„ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ (๊ฐ€์งœ ์ฝ”๋“œ์ด๊ฑฐ๋‚˜ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ)

searchMoviesAPI('amadeus', () => {
	saveToMyDB(movies, () => {
    	// if it works, run this
    }, () => {
    	// if it doesn't work, run this
    })
},() => {
	// if API is down, or request failed
})

โฌ†๏ธ ์ด๊ฒŒ ์ผ๋ฐ˜์ ์ธ ๊ฑฐ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ธฐ๊ฐ€ ์ž‘๋™ํ•  ์ˆ˜ ๋„ ์žˆ๊ณ , 

์ธํ„ฐ๋„ท์ด ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ถŒํ•œ์ด ์—†๊ฑฐ๋‚˜, ์šฉ๋Ÿ‰์ด ์—†๋‹ค๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๊ฑฐ๋‹ค. 

 

๋”ฐ๋ผ์„œ ๋‘ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ์˜ˆ์ƒํ•ด์•ผํ•œ๋‹ค. 

๋ช‡ ์ดˆ ํ›„ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ์•Œ ์ˆ˜๊ฐ€ ์—†๋‹ค. 

 

 

๊ฒฐ๋ก , ์ฝœ๋ฐฑ์˜ ์ค‘๋ณต์€ ์ข‹์ง€ ์•Š์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์ฝœ๋ฐฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ”ํ•˜๋‹ค!

 

์ฝœ๋ฐฑ ์ค‘๋ณต (์ฝœ๋ฐฑ ํ—ฌ)์€ ๋ถˆ๊ฐ€ํ”ผํ•˜๋‹ค!! 

 


์ด๋Ÿฐ ์–ด๋ ค์›€์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ๊ฒƒ์ด ๋ฐ”๋กœ Promise์™€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜!!!

 

Promise๋Š” ์–ด๋–ค ์—ฐ์‚ฐ, ๋น„๋™๊ธฐ ์—ฐ์‚ฐ์ด ์ตœ์ข…์ ์œผ๋กœ ์™„๋ฃŒ ํ˜น์€ ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ์‹คํŒจํ–ˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” ๊ฐ์ฒด์ด๋‹ค. 

 

const fakeRequestCallback = (url, success, failure) => {
	const delay = Math.floor(Math.random() * 4500) + 500;
    setTimeout(() => {
    	if(delay > 4000) {
        	failure('Connection Timeout :(')
        } else {
        	success(`Here is your fake data from ${url}`)
        }
    }, delay)
}

fakeRequestCallback('books.com', function() {
	console.log('IT WORKED!!')
}, function() {
	console.log('ERROR!!')
})

โžฅ๋žœ๋ค์ด๊ธฐ ๋•Œ๋ฌธ์—, ์‹คํŒจ, ์„ฑ๊ณต ๋‘˜ ์ค‘์— ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค. 

 

 

์ถ”๊ฐ€ํ•™์Šต

Math.random()

2022.06.01 - [JavaScript] - TIL) Math.random(), ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, ๋ฐ˜์˜ฌ๋ฆผ(round), ์˜ฌ๋ฆผ(ceil), ๋‚ด๋ฆผ(floor)

 

 

 

const fakeRequestCallback = (url, success, failure) => {
	const delay = Math.floor(Math.random() * 4500) + 500;
    setTimeout(() => {
    	if(delay > 4000) {
        	failure('Connection Timeout :(')
        } else {
        	success(`Here is your fake data from ${url}`)
        }
    }, delay)
}

fakeRequestCallback('books.com', 
	function(response) {
	console.log('IT WORKED!!')
    console.log(response)
}, function(err) {
	console.log('ERROR!!', err)
})

โžฅ๋žœ๋ค์ด๊ธฐ ๋•Œ๋ฌธ์—, ์‹คํŒจ, ์„ฑ๊ณต ๋‘˜ ์ค‘์— ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

 

 

๐Ÿ‘‡ books.com ์˜ page2 ์š”์ฒญ๋„ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด!

 

const fakeRequestCallback = (url, success, failure) => {
	const delay = Math.floor(Math.random() * 4500) + 500;
    setTimeout(() => {
    	if(delay > 4000) {
        	failure('Connection Timeout :(')
        } else {
        	success(`Here is your fake data from ${url}`)
        }
    }, delay)
}

fakeRequestCallback('books.com/page1',
  function (response) {
    console.log('IT WORKED!!');
    console.log(response);
    fakeRequestCallback(
      'books.com/page2',
      function (response) {
        console.log('IT WORKED AGAIN!!');
        console.log(response);
      },
      function (err) {
        console.log('ERROR!!(2nd request)', err);
      }
    );
  },
  function (err) {
    console.log('ERROR!!', err);
  }
);

โžฅ ์œ„ ์…‹ ์ค‘ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

 

 

** ๋‘ ๋ฒˆ์งธ ์š”์ฒญ์„ ๋ณด๋‚ด๋„๋ก ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฒซ๋ฒˆ์งธ ์„ฑ๊ณต ์ฝœ๋ฐฑ ์•ˆ์— ๋ผ์›Œ๋„ฃ์–ด์•ผํ•œ๋‹ค!

 

 

const fakeRequestCallback = (url, success, failure) => {
	const delay = Math.floor(Math.random() * 4500) + 500;
    setTimeout(() => {
    	if(delay > 4000) {
        	failure('Connection Timeout :(')
        } else {
        	success(`Here is your fake data from ${url}`)
        }
    }, delay)
}

fakeRequestCallback('books.com/page1', 
	function(response) {
	console.log('IT WORKED!!')
    console.log(response)
    fakeRequestCallback('books.com/page2',
    	function(response) {
			console.log('IT WORKED AGAIN!!')
    		console.log(response)
            fakeRequestCallback('books.com/page3', 
            	function (response) {
                	console.log('IT WORKED AGAIN (3rd request)!!')
    				console.log(response)
                },
                function (err) {
        			console.log('ERROR!!(3rd request)', err)
            	})
        },
        function (err) {
        	console.log('ERROR!!(2nd request)', err)
        })
}, function(err) {
	console.log('ERROR!!', err)
})

โžฅ ์–ด๋””์„œ๋“  ์‹คํŒจํ•˜๋Š” ์ˆœ๊ฐ„, ์„ฑ๊ณต ์ฝœ๋ฐฑ์ด ์‹คํ–‰๋˜์ง€ ์•Š์•„์„œ ๋‹ค์Œ ์š”์ฒญ์œผ๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š๊ณ  ์ข…๋ฃŒํ•œ๋‹ค. 

 

 


Promise = ๊ฐ’์ด๋‚˜ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์ตœ์ข… ๊ฒฐ๊ณผ(์•ฝ์†)์ด๋‹ค. 

 

const fakeRequestCallback = (url, success, failure) => {
	const delay = Math.floor(Math.random() * 4500) + 500;
    setTimeout(() => {
    	if(delay > 4000) {
        	failure('Connection Timeout :(')
        } else {
        	success(`Here is your fake data from ${url}`)
        }
    }, delay)
}

const fakeRequestPromise = (url) => {
	return new Promise((resolve,reject) => {
    	const delay = Math.floor(Math.random() * 4500) + 500;
        setTimeout(() => {
        	if(delay > 4000) {
            	reject('Connection Timeout :(')
            } else {
            	resolve(`Here is your fake data from ${url}`)
            }
        }, delay)
    })
}

const request = fakeRequestPromise('yelp.com/api/coffee');
request
	.then(() => {
		console.log('IT WORKED!!!')
	})
    .catch(() => {
		console.log('OH NO, ERROR')
	})

๐Ÿ‘‡ ์ฝœ๋ฐฑ ๋ฒ„์ „์˜ ์ฝ”๋“œ์™€ ๋˜‘๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•œ๋‹ค. 

 

๐Ÿ‘‡ request๋Š” ๊ฐ์ฒด์ด๋‹ค. .then๊ณผ .catch๋Š” request์˜ ๋ฉ”์„œ๋“œ์ด๋‹ค. ๋‘˜ ๋‹ค ๊ฐ๊ฐ ์ฝœ๋ฐฑ์„ ๋„ฃ๋Š”๋‹ค. 

๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์‹คํ–‰์ด ๋ ํ…๋ฐ, Promise๊ฐ€ resolve๋˜๋ฉด () => {console.log('IT WORKED!!!')} ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ ,

reject๋˜๋ฉด () => {console.log('OH NO, ERROR')} ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค. 

 

 

 

fakeRequestPromise('yelp.com/api/coffee/page1')
	.then(() => {
		console.log('IT WORKED!!! (page1)')
        fakeRequestPromise('yelp.com/api/coffee/page2')
            .then(() => {
        		console.log('IT WORKED!!! (page2)')
           		fakeRequestPromise('yelp.com/api/coffee/page3')
            		.then(() => {
        				console.log('IT WORKED!!! (page3)')
               		 })
               		 .catch(() => {
                		console.log('OH NO, ERROR (page3)')
               		 })
    	   	})
       		.catch(() => {
        	console.log('OH NO, ERROR (page2)')
       		})
	})
    .catch(() => {
		console.log('OH NO, ERROR (page1)')
	})

โžฅ page1 ์š”์ฒญ ์„ฑ๊ณต ํ›„ page2, page3 ์š”์ฒญํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ promise๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

 

 

๐Ÿ‘‡ promise ๊ฐ€ callback ๋ณด๋‹ค ๋‚˜์€ ์ด์œ 

 

fakeRequestPromise('yelp.com/api/coffee/page1')
	.then(() => {
    	console.log('IT WORKED!! (page1)')
        return fakeRequestPromise('yelp.com/api/coffee/page2') // Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ 
	})
    .then(() => {                                              // .then์œผ๋กœ ๊ทธ ๋ฐ˜ํ™˜์„ ํ˜ธ์ถœํ•œ๋‹ค.(๊ทธ๋ž˜์„œ ์ค‘์ฒฉ ํ•„์š”์—†์Œ)
    	console.log('IT WORKED!! (page2)')
        return fakeRequestPromise('yelp.com/api/coffee/page3')
    })
    .then(() => {
    	console.log('IT WORKED!! (page3)')
    })
    .catch(() => {                                             // catch๋Š” ํ•˜๋‚˜๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค!!
    	console.log('OH NO, A REQUEST FAILED')
    })

โžฅ Promise ๋Š” .then ์•ˆ์—์„œ  ๋‚˜ ์ž์‹ ์—๊ฒŒ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ค‘์ฒฉ์—†์ด ๋‹ค๋ฅธ .then๋“ค์„ ์—ฐ์‡„์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. 

์–ด๋””์„œ๋“  Promise๊ฐ€ reject๋˜๋ฉด, ์ „๋ถ€ ๋ฌด์‹œํ•˜๊ณ  ๋ฐ”๋กœ catch๋กœ ๊ฐ„๋‹ค. (.then ์ฝœ๋ฐฑ ์•ˆ์—์„œ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)

 

Promise์— ๋Œ€ํ•ด ์•Œ์•„๋‘˜ ๊ฒƒ์€ ๊ฐ’์œผ๋กœ resolve ๋˜๋Š” reject๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. 

์—ฌ๊ธฐ ์ฝœ๋ฐฑ์—๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋‹ค. 

ํ•˜์ง€๋งŒ promise๋Š” ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์œผ๋กœ resolve ๋˜๋Š” reject๋œ๋‹ค. (then์ด ๊ทธ ๊ฐ’์„ ๋ฐ›๋Š”๋‹ค.)

 

 

์‹ค์ œ ์š”์ฒญ์„ ์ž‘์„ฑํ•œ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.  ๐Ÿ‘‡ ๋งค๊ฐœ๋ณ€์ˆ˜์— ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„ฃ๊ณ  ์ถœ๋ ฅํ•ด๋ณด์ž

 

fakeRequestPromise('yelp.com/api/coffee/page1')
	.then((data) => {
    	console.log('IT WORKED!! (page1)')
    	console.log(data)
        return fakeRequestPromise('yelp.com/api/coffee/page2')
	})
    .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)
    })

 

 


์ƒˆ Promise ์ž‘์„ฑ๋ฒ•

new Promise((resolve, reject) => {
	resolve();
})

โžฅ PromiseState: 'fulfilled'

 

new Promise((resolve, reject) => {
	reject();
})

โžฅ PromiseState: 'rejected'

 

 

new Promise((resolve, reject) => {

})

โžฅ PromiseState: 'pending'

 


Promise์˜ ์„ธ ๊ฐ€์ง€ ์ƒํƒœ

pending: ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘
fulfilled: ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋๋‚ฌ๊ณ  ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
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)
	})
    .catch((err) => {
    	console.log('OH NO!',err)
    })

 

โžฅ ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค. 

 

** ์ƒˆ Promise๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด, ํ•จ์ˆ˜์˜ ๋‘ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์•ผํ•œ๋‹ค. 

์ฒซ๋ฒˆ์งธ๋Š” Promise๋ฅผ resolveํ•  ํ•จ์ˆ˜, ๋‘๋ฒˆ์งธ๋Š” Promise๋ฅผ rejectํ•  ํ•จ์ˆ˜๋‹ค. 

 


Callback ํ•จ์ˆ˜๋ฅผ Promise๋กœ ๋งŒ๋“ค์–ด๋ณด์ž!

const delayedColorChange = (newColor,delay,doNext) => {
	setTimeout(() => {
    	document.body.style.backgroundColor = newColor;
        doNext();
    }, delay)
}

delayedColorChange('red',1000,() => {
	delayedColorChange('orange',1000,() => {
    	delayedColorChange('yellow',1000,() => {
        	delayedColorChange('green',1000,() => {
                delayedColorChange('blue',1000,() => {
        		})
        	})
        })
    })
});

 

๐Ÿ‘‡ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ์“ด ์ฝ”๋“œ๋ฅผ Promise๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๋กœ ๋ฐ”๊ฟ”๋ณด์ž!!

delayedColorChange ํ•จ์ˆ˜๊ฐ€ ์ฝœ๋ฐฑ์„ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ  Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค. 

 

const delayedColorChange = (color, delay) => {
	return new Promise((resolve, reject) => {
    	setTimeout(() => {
        	document.body.style.backgroundColor = color;
            resolve();
        }, delay)
    })
}
โžฅ ์œ„์˜ callbackํ•จ์ˆ˜์™€ ๋น„๊ตํ•ด๋ณด๋ฉด, ๋งŽ์€ ๊ฒƒ์„ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ์ค‘์ฒฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ์ ์—์„œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค. 

delayedColorChange('red', 1000)
delayedColorChange('orange', 1000)

// ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ’์„ ๋„์ถœํ•œ๋‹ค. 

delayedColorChange('red', 1000)
	.then(() => {
    	delayedColorChange('orange', 1000)
    })

// ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ’์„ ๋„์ถœํ•œ๋‹ค. 

delayedColorChange('red', 1000)
	.then(() => {
    	return delayedColorChange('orange', 1000)
    })


// ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ’์„ ๋„์ถœํ•œ๋‹ค. 

delayedColorChange('red', 1000)             
	.then(() => delayedColorChange('orange', 1000))
    .then(() => delayedColorChange('yellow', 1000))
    .then(() => delayedColorChange('green', 1000))
    .then(() => delayedColorChange('blue', 1000))

 

 

๐Ÿ˜ƒํ˜น์‹œ๋‚˜ ์ž˜๋ชป๋œ ๊ฐœ๋… ์ „๋‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ €์˜ ์„ฑ์žฅ์— ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค๐Ÿค“