๐Ÿ“– ํ”„๋กœ๋ฏธ์Šค

c_yjยท2022๋…„ 7์›” 21์ผ
0

DeepDive

๋ชฉ๋ก ๋ณด๊ธฐ
39/42
post-thumbnail

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํ•˜๋‚˜์˜ ํŒจํ„ด์œผ๋กœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ฝœ๋ฐฑ ํŒจํ„ด์€ ์ฝœ๋ฐฑ ํ—ฌ๋กœ ์ธํ•ด ๊ฐ€๋…์„ฑ์ด ๋‚˜์˜๊ณ  ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ค‘ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ๊ณค๋ž€ํ•˜๋ฉฐ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ๋„ ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.

ES6์—์„œ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋˜ ๋‹ค๋ฅธ ํŒจํ„ด์œผ๋กœ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋„์ž…ํ–ˆ๋‹ค. ํ”„๋กœ๋ฏธ์Šค๋Š” ์ „ํ†ต์ ์ธ ์ฝœ๋ฐฑ ํŒจํ„ด์ด ๊ฐ€์ง„ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๋ฉฐ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์‹œ์ ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ฝœ๋ฐฑ ํŒจํ„ด์˜ ๋‹จ์  ๐Ÿ˜‰

์ฝœ๋ฐฑ ํ—ฌ

//GET ์š”์ฒญ์„ ์œ„ํ•œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜
const get = url => {
	const xhr = new XHMLHttpRequest();
    xhr.open('GET', url_;
    xhr.send();
    xhr.onload =()=>{
    	if(xhr.status ===200){
        	console.log(JSON.parse(xhr.response));
        }else{
        	console.error(`${xhr.status} ${xhr.statusText}`);
        }
    };
};

// id๊ฐ€ 1์ธ post๋ฅผ ์ทจ๋“
get('https://jsonplaceholder.typicode.com/posts/1';

/*
{ 
	"userId": 1,
	"id": 1,
    "title" "sunt aut dssfd...",
    "body" "sfsdsafd aa sdffdsd..."
}
*/

์œ„ ์˜ˆ์ œ์˜ get ํ•จ์ˆ˜๋Š” ์„œ๋ฒ„์˜ ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅํ•œ๋‹ค. get ํ•จ์ˆ˜๊ฐ€ ์„œ๋ฒ„์˜ ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋ ๊นŒ?
get ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋‹ค. ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ž€ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•œ ํ•จ์ˆ˜๋ฅผ ๋งํ•œ๋‹ค. ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜๋‹ค ํ•ด๋„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ์ข…๋ฃŒ๋œ๋‹ค. ์ฆ‰, ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋œ ์ดํ›„์— ์™„๋ฃŒ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ์—์„œ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์™ธ๋ถ€๋กœ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋ฉด ๊ธฐ๋Œ€ํ•œ ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.

let g = 0;

// ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ธ setTimeout ํ•จ์ˆ˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์™ธ๋ถ€๋กœ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜์ง€ ๋ชปํ•œ๋‹ค.
setTimeout(() => {g = 100;}, 0);
console.log(g); // 0

GET ์š”์ฒญ์„ ์ „์†กํ•˜๊ณ  ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ์ „๋‹ฌ๋ฐ›๋Š” get ํ•จ์ˆ˜๋„ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋‹ค. get ํ•จ์ˆ˜๊ฐ€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ธ ์ด์œ ๋Š” get ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ onload ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. get ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด GET ์š”์ฒญ์„ ์ „์†กํ•˜๊ณ  onload ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•œ ๋‹ค์Œ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ฆ‰์‹œ ์ข…๋ฃŒ๋œ๋‹ค. ์ฆ‰, ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ธ get ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ onload ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” get ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋œ ์ดํ›„์— ์‹คํ–‰๋œ๋‹ค. ๋”ฐ๋ผ์„œ get ํ•จ์ˆ˜์˜ onload ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ์„œ๋ฒ„์˜ ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋ฉด ๊ธฐ๋Œ€ํ•œ ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.

get ํ•จ์ˆ˜๊ฐ€ ์„œ๋ฒ„์˜ ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •ํ•ด ๋ณด์ž.

//GET ์š”์ฒญ์„ ์œ„ํ•œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜
const get = url => {
	const xhr = new XHMLHttpRequest();
    xhr.open('GET', url);
    xhr.send();
    
    xhr.onload =()=>{
    	if(xhr.status ===200){
        	// 1. ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
        	return JSON.parse(xhr.response);
        }else{
        	console.error(`${xhr.status} ${xhr.statusText}`);
        }
    };
};

// id๊ฐ€ 1์ธ post๋ฅผ ์ทจ๋“
const response= get('https://jsonplaceholder.typicode.com/posts/1';
console.log(response); //undefined

get ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , HTTP ์š”์ฒญ์„ ์ดˆ๊ธฐํ™”ํ•œ ํ›„, HTTP ์š”์ฒญ์„ ์ „์†กํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  xhr.onload ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ณ  ์ข…๋ฃŒํ•œ๋‹ค. ์ด๋–„ get ํ•จ์ˆ˜์— ๋ช…์‹œ์ ์ธ ๋ฐ˜ํ™˜๋ฌธ์ด ์—†์œผ๋ฏ€๋กœ get ํ•จ์ˆ˜๋Š” undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค(2)

xhr.onload ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ์— ๋ฐ”์ธ๋”ฉํ•œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ๋ฐ˜ํ™˜๋ฌธ(1)์€ get ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๋ฌธ์ด ์•„๋‹ˆ๋‹ค. ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์€ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•œ ๋‹ค์Œ์— ์บ์น˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ onload ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ get ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ๋ฐ˜ํ™˜๊ฐ’์„ get ํ•จ์ˆ˜๊ฐ€ ์บ์น˜ํ•˜์—ฌ ๋‹ค์‹œ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ onload ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” get ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿด ์ˆ˜๋„ ์—†๋‹ค. ๋”ฐ๋ผ์„œ onload ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ๋ฐ˜ํ™˜๊ฐ’์€ ์บ์น˜ํ•  ์ˆ˜ ์—†๋‹ค.

<!DOCTYPE html>
<html>
<body>
  <input type="text>
  <script>
    document.querySelector('input').oninput = function () {
    console.log(this.value);
    // ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ์˜ ๋ฐ˜ํ™˜์€ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.
    return this.value;
  };
 </script>
</body>
</html>

๊ทธ๋ ‡๋‹ค๋ฉด 1์—์„œ ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋ฉด ์–ด๋–จ๊นŒ?

let todos;

//GET ์š”์ฒญ์„ ์œ„ํ•œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜
const get = url => {
	const xhr = new XHMLHttpRequest();
    xhr.open('GET', url_;
    xhr.send();
    
    xhr.onload =()=>{
    	if(xhr.status ===200){
        	// 1. ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•œ๋‹ค.
        	todos = JSON.parse(xhr.response);
        }else{
        	console.error(`${xhr.status} ${xhr.statusText}`);
        }
    };
};

// id๊ฐ€ 1์ธ post๋ฅผ ์ทจ๋“get('https://jsonplaceholder.typicode.com/posts/1';
console.log(todos); //undefined

xhr.onload ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ์— ๋ฐ”์ธ๋”ฉํ•œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ์–ธ์ œ๋‚˜ 2์˜ console.log๊ฐ€ ์ข…๋ฃŒํ•œ ์ดํ›„์— ํ˜ธ์ถœํ•œ๋‹ค. ๋”ฐ๋ผ์„œ 2์˜ ์‹œ์ ์—๋Š” ์•„์ง ์ „์—ญ ๋ณ€์ˆ˜ todos์— ์„œ๋ฒ„์˜ ์‘๋‹ต ๊ฒฐ๊ณผ๊ฐ€ ํ• ๋‹น๋˜๊ธฐ ์ด์ „์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด. xhr.onload ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜์— ํ• ๋‹น(1)ํ•˜๋ฉด ์ฒ˜๋ฆฌ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ ์ด์œ ์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด์ž

๋น„๋™๊ธฐ ํ•จ์ˆ˜ get์ด ํ˜ธ์ถœ๋˜๋ฉด ํ•จ์ˆ˜ ์ฝ”๋“œ๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ๊ณผ์ •์—์„œ get ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์— ํ‘ธ์‹œ๋œ๋‹ค. ์ดํ›„ ํ•จ์ˆ˜ ์ฝ”๋“œ ์‹คํ–‰ ๊ณผ์ •์—์„œ xhr.onload ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.

get ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒํ•˜๋ฉด get ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ ์Šคํƒ์—์„œ ํŒ๋˜๊ณ , ๊ณง๋ฐ”๋กœ 2์˜ console.log๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. ์ด๋•Œ console.log์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์ด ํ‘ธ์‹œ๋œ๋‹ค. ๋งŒ์•ฝ console.log๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ง์ „์— load ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋”๋ผ๋„ xhr.onload ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ์— ๋ฐ”์ธ๋”ฉํ•œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ๊ฒฐ์ฝ” console.log๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์ด ๋„์ฐฉํ•˜๋ฉด xhr ๊ฐ์ฒด์—์„œ load ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋–„ xhr.onload ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ์— ๋ฐ”์ธ๋”ฉํ•œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ฆ‰์‹œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. xhr.onload ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” load ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ผ๋‹จ ํ…Œ์Šคํฌ ํ์— ์ €์žฅ๋˜์–ด ๋Œ€๊ธฐํ•˜๋‹ค๊ฐ€, ์ฝœ ์Šคํƒ์ด ๋น„๋ฉด ์ด๋ฒคํŠธ ๋ฃจํ”„์— ์˜ํ•ด ์ฝœ ์Šคํƒ์œผ๋กœ ํ‘ธ์‹œ๋˜์–ด ์‹คํ–‰๋œ๋‹ค. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋„ ํ•จ์ˆ˜์ด๋ฏ€๋กœ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ํ‰๊ฐ€ โ†’ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ โ†’ ์ฝœ ์Šคํƒ์— ํ‘ธ์‹œ โ†’ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

๋”ฐ๋ผ์„œ xhr.onload ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์ ์—๋Š” ์ฝœ ์Šคํƒ์ด ๋นˆ ์ƒํƒœ์—ฌ์•ผ ํ•˜๋ฏ€๋กœ 2์˜ console.log๋Š” ์ด๋ฏธ ์ข…๋ฃŒ๋œ ์ดํ›„๋‹ค. ๋งŒ์•ฝ get ํ•จ์ˆ˜ ์ดํ›„์— console.log๊ฐ€ 100๋ฒˆ ํ˜ธ์ถœ๋œ๋‹ค ํ•ด๋„ xhr.onload ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ๋ชจ๋“  console.log๊ฐ€ ์ข…๋ฃŒํ•œ ์ดํ›„์— ์‹คํ–‰๋œ๋‹ค. ์ฆ‰, xhr.onload ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜์— ์„œ๋ฒ„์˜ ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ ํ• ๋‹นํ•˜๊ธฐ ์ด์ „์— console.log๊ฐ€ ๋จผ์ € ํ˜ธ์ถœ๋˜์–ด undefined๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

์ด์ฒ˜๋Ÿผ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์™ธ๋ถ€์— ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†๊ณ , ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜๋„ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ(์„œ๋ฒ„์˜ ์‘๋‹ต ๋“ฑ)์— ๋Œ€ํ•œ ํ›„์† ์ฒ˜๋ฆฌ๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋–„ ๋ฐ”๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ๋ฒ”์šฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋น„๋™๊ธฐ ํ•จ์ˆ˜์— ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ํ›„์† ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด ํ˜ธ์ถœ๋  ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ํ˜ธ์ถœ๋  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค,

//GET ์š”์ฒญ์„ ์œ„ํ•œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜
const get = (url, successCallback, failureCallback) => {
	const xhr = new XHMLHttpRequest();
    xhr.open('GET', url_;
    xhr.send();
    
    xhr.onload =()=>{
    	if(xhr.status ===200){
        	// ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋ฉด์„œ ํ˜ธ์ถœํ•˜์—ฌ ์‘๋‹ต์— ๋Œ€ํ•œ ํ›„์† ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
        	successCallback(JSON.parse(xhr.response));
        }else{
        	// ์—๋Ÿฌ ์ •๋ณด๋ฅผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋ฉด์„œ ํ˜ธ์ถœํ•˜์—ฌ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
        	failureCallback(xhr.status); 
        }
    };
};

// id๊ฐ€ 1์ธ post๋ฅผ ์ทจ๋“
// ์„œ๋ฒ„์˜ ์‘๋‹ต์— ๋Œ€ํ•œ ํ›„์† ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ธ get์— ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.
get(
	'https://jsonplaceholder.typicode.com/posts/1',
    console.log, 
	console.error
);

์ด์ฒ˜๋Ÿผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ํ›„์† ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ๋˜๋‹ค์‹œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์ค‘์ฒฉ๋˜์–ด ๋ณต์žก๋„๊ฐ€ ๋†’์•„์ง€๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ด๋ฅผ ์ฝœ๋ฐฑ ํ—ฌ์ด๋ผ ํ•œ๋‹ค.

// GET ์š”์ฒญ์„ ์œ„ํ•œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜
const get = (url, callback) => {
  const xhr = new XMLHttpRequest();
  xhr.open('GET', url);
  xhr.send();
  
  xhr.onload = () => {
    if(xhr.status === 200) {
      // ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋ฉด์„œ ํ˜ธ์ถœํ•˜์—ฌ ์‘๋‹ต์— ๋Œ€ํ•œ ํ›„์† ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค..
      callback(JSON.parse(xhr.response));
    } else {
      console.error(`${xhr.status} ${xhr.statusText}`);
    }
  };
};
const url = 'https://jsonplaceholder.typicode.com';

// id๊ฐ€ 1์ธ post์˜ userId๋ฅผ ์ทจ๋“
get(`${url}/posts/1`, ({ userId }) => {
  console.log(userId) ; // 1
  // post์˜ userId๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ user ์ •๋ณด๋ฅผ ์ทจ๋“
  get(`${url}/users/${userId}`, userInfo => {
    console.log(userInfo); // {id: 1, name: "Leanne Graham", username: "bret", ...}
  });
});

์œ„ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด GET ์š”์ฒญ์„ ํ†ตํ•ด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต(id๊ฐ€ 1์ธ post)์„ ์ทจ๋“ํ•˜๊ณ  ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋˜๋‹ค์‹œ GET ์š”์ฒญ์„ ํ•œ๋‹ค. ์ฝœ๋ฐฑ ํ—ฌ์€ ๊ฐ€๋…์„ฑ์„ ๋‚˜์˜๊ฒŒ ํ•˜๋ฉฐ ์‹ค์ˆ˜๋ฅผ ์œ ๋ฐœํ•˜๋Š” ์›์ธ์ด ๋œ๋‹ค. ๋‹ค์Œ์€ ์ฝœ๋ฐฑ ํ—ฌ์ด ๋ฐœ์ƒํ•˜๋Š” ์‚ฌ๋ก€๋‹ค.

get('/step1', a => {
  get(`/step2/${a}`, b => {
    get(`/step3/${b}`, c => {
      get(`/step4/${c}`, d => {
        console.log(d);
      });
    });
  });
});

์—๋Ÿฌ ์ฒ˜๋ฆฌ์˜ ํ•œ๊ณ„

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ฝœ๋ฐฑ ํŒจํ„ด์˜ ๋ฌธ์ œ์  ์ค‘์—์„œ ๊ฐ€์žฅ ์‹ฌ๊ฐํ•œ ๊ฒƒ์€ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๊ฐ€ ๊ณค๋ž€ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

try {
  setTimeout(() => { throw new Error('Error!'); }, 1000);
} catch (e) {
  // ์—๋Ÿฌ๋ฅผ ์บ์น˜ํ•˜์ง€ ๋ชปํ•œ๋‹ค
  console.error('์บ์น˜ํ•œ ์—๋Ÿฌ', e);
}

๋น„๋™๊ธฐ ํ•จ์ˆ˜์ธ setTimeout์ด ํ˜ธ์ถœ๋˜๋ฉด setTimeout ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์ฝœ ์Šคํƒ์— ํ‘ธ์‹œ๋˜์–ด ์‹คํ–‰๋œ๋‹ค. setTImeout์€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ด๋ฏ€๋กœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ์ข…๋ฃŒ๋˜์–ด ์ฝœ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค. ์ดํ›„ ํƒ€์ด๋จธ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด setTimeout ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ํƒœ์Šคํฌ ํ๋กœ ํ‘ธ์‹œ๋˜๊ณ  ์ฝœ ์Šคํƒ์ด ๋น„์–ด์กŒ์„ ๋•Œ ์ด๋ฒคํŠธ ๋ฃจํ”„์— ์˜ํ•ด ์ฝœ ์Šคํƒ์œผ๋กœ ํ‘ธ์‹œ๋˜์–ด ์‹คํ–‰๋œ๋‹ค.

setTimeout ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋–„ setTimeout ํ•จ์ˆ˜๋Š” ์ด๋ฏธ ์ฝœ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋œ ์ƒํƒœ๋‹ค. ์ด๊ฒƒ์€ setTImeout ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒƒ์ด setTimeout ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. setTimeout ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ž๊ฐ€ setTimeout ํ•จ์ˆ˜๋ผ๋ฉด ์ฝœ ์Šคํƒ์˜ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์ผ ๋•Œ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ํ•˜์œ„ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ setTimeout ํ•จ์ˆ˜์—ฌ์•ผ ํ•œ๋‹ค

์—๋Ÿฌ๋Š” ํ˜ธ์ถœ์ž ๋ฐฉํ–ฅ์œผ๋กœ ์ „ํŒŒ๋œ๋‹ค ์ฆ‰, ์ฝœ ์Šคํƒ์˜ ์•„๋ž˜ ๋ฐฉํ–ฅ์œผ๋กœ ์ „ํŒŒ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์•ž์—์„œ ์‚ดํŽด๋ณธ ๋ฐ”์™€ ๊ฐ™์ด setTimeout ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋ฐœ์ƒ์‹œํ‚จ ์—๋Ÿฌ๋Š” catch ๋ธ”๋ก์—์„œ ์บ์น˜๋˜์ง€ ์•Š๋Š”๋‹ค.

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ฝœ๋ฐฑ ํŒจํ„ด์€ ์ฝœ๋ฐฑ ํ—ฌ์ด๋‚˜ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๊ฐ€ ๊ณค๋ž€ํ•˜๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.๐Ÿ”ด

ํ”„๋กœ๋ฏธ์Šค์˜ ์ƒ์„ฑ ๐Ÿ˜™

Promise ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜๋ฉด ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ES6์—์„œ ๋„์ž…๋œ Promise๋Š” ํ˜ธ์ŠคํŠธ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ECMAScript ์‚ฌ์–‘์— ์ •์˜๋œ ํ‘œ์ค€ ๋นŒํŠธ์ธ ๊ฐ์ฒด๋‹ค.
Promise ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋ฐ ์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” resolve์™€ reject ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.

// ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise = new Promise((resolve, reject) => {
  // Promise ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค
  if (/* ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์„ฑ๊ณต */) {
      resolve('result');
  }else{ /* ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์‹คํŒจ */
      reject('failure reason');
  }
});

Promise ์ƒ์„ฑ์ž ใ…Ž๋งˆ์ˆ˜๊ฐ€ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ resolve ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์‹คํŒจํ•˜๋ฉด reject ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

ํ”„๋กœ๋ฏธ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜„์žฌ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒํƒœ์ •๋ณด๋ฅผ ๊ฐ–๋Š”๋‹ค.

ํ”„๋กœ๋ฏธ์Šค์˜ ์ƒํƒœ ์ •๋ณด์˜๋ฏธ์ƒํƒœ ๋ณ€๊ฒฝ ์กฐ๊ฑด
pending๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์•„์ง ์ˆ˜ํ–‰๋˜์ง€ ์•Š์€ ์ƒํƒœํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์ƒ์„ฑ๋œ ์งํ›„ ๊ธฐ๋ถ„ ์ƒํƒœ
fulfilled๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋œ ์ƒํƒœ(์„ฑ๊ณต)resolve ํ•จ์ˆ˜ ํ˜ธ์ถœ
rejected๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋œ ์ƒํƒœ(์‹คํŒจ)reject ํ•จ์ˆ˜ ํ˜ธ์ถœ

ํ”„๋กœ๋ฏธ์Šค์˜ ์ƒํƒœ๋Š” resolve ๋˜๋Š” reject ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค.

fulfilled ๋˜๋Š” rejected ์ƒํƒœ๋ฅผ settled ์ƒํƒœ๋ผ๊ณ  ํ•œ๋‹ค. settled ์ƒํƒœ๋Š” fulfilled ๋˜๋Š” rejected ์ƒํƒœ์™€ ์ƒ๊ด€์—†์ด pending์ด ์•„๋‹Œ ์ƒํƒœ๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋œ ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค.
ํ”„๋กœ๋ฏธ์Šค๋Š” pending ์ƒํƒœ์—์„œ fulfilled ๋˜๋Š” rejected ์ƒํƒœ, ์ฆ‰ settled ์ƒํƒœ๋กœ ๋ณ€ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋‹จ settled ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ๋”๋Š” ๋‹ค๋ฅธ ์ƒํƒœ๋กœ ๋ณ€ํ™”ํ•  ์ˆ˜ ์—†๋‹ค.

ํ”„๋กœ๋ฏธ์Šค๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ƒํƒœ์™€ ๋”๋ถˆ์–ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋„ ์ƒํƒœ๋กœ ๊ฐ–๋Š”๋‹ค.

// fulfilled๋œ ํ”„๋กœ๋ฏธ์Šค
const fulfilled = new Promise(resolve => resolve(1));


๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด ํ”„๋กœ๋ฏธ์Šค๋Š” pending ์ƒํƒœ์—์„œ fulfilled ์ƒํƒœ๋กœ ๋ณ€ํ™”ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ์ธ 1์„ ๊ฐ’์œผ๋กœ ๊ฐ–๋Š”๋‹ค.

// rejected๋œ ํ”„๋กœ๋ฏธ์Šค
const rejected = new Promise((_, reject) => reject(new Error('error occurred')));

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ํ”„๋กœ๋ฏธ์Šค๋Š” pending ์ƒํƒœ์—์„œ rejected ์ƒํƒœ๋กœ ๋ณ€ํ™”ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ์ธ Error ๊ฐ์ฒด๋ฅผ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค. ์ฆ‰, ํ”„๋กœ๋ฏธ์Šค๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ƒํƒœ์™€ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋‹ค.

ํ”„๋กœ๋ฏธ์Šค์˜ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ ๐Ÿ˜—

ํ”„๋กœ๋ฏธ์Šค์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ƒํƒœ๊ฐ€ ๋ณ€ํ™”ํ•˜๋ฉด ์ด์— ๋”ฐ๋ฅธ ํ›„์† ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. ํ”„๋กœ๋ฏธ์Šค๊ฐ€ fulfilled ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ํ”„๋กœ๋ฏธ์Šค์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•ด์•ผ ํ•˜๊ณ , ํ”„๋กœ๋ฏธ์Šค๊ฐ€ rejected ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ํ”„๋กœ๋ฏธ์Šค์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํ”„๋กœ๋ฏธ์Šค๋Š” ํ›„์† ๋ฉ”์„œ๋“œ then, catch, finally๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
ํ”„๋กœ๋ฏธ์Šค์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ƒํƒœ๊ฐ€ ๋ณ€ํ™”ํ•˜๋ฉด ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์— ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์„ ํƒ์ ์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค. ์ด๋–„ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ํ”„๋กœ๋ฏธ์Šค์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋œ๋‹ค.

Promise.prototype.then

then ๋ฉ”์„œ๋“œ๋Š” ๋‘ ๊ฐœ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.

  • ์ฒซ ๋ฒˆ์งธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ํ”„๋กœ๋ฏธ์Šค๊ฐ€ fulfilled ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ํ˜ธ์ถœ๋œ๋‹ค. ์ด๋–„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ํ”„๋กœ๋ฏธ์Šค์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.
  • ๋‘ ๋ฒˆ์งธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ํ”„๋กœ๋ฏธ์Šค๊ฐ€ rejected ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ํ˜ธ์ถœ๋œ๋‹ค. ์ด๋•Œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ํ”„๋กœ๋ฏธ์Šค์˜ ์—๋Ÿฌ๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.

์ฆ‰, ์ฒซ ๋ฒˆ์จฐ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์„ฑ๊ณต ์ฒ˜๋ฆฌ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์ด๋ฉฐ, ๋‘ ๋ฒˆ์งธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์‹คํŒจํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์‹คํŒจ ์ฒ˜๋ฆฌ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋‹ค.

// fulfilled
new Promise(resolve => resolve('fulfilled'))
	.then(v => console.log(v), e=> console.error(e)); // fulfilled

// rejected
new Promise((_, reject) => reject(new Error('rejected')))
	.then(v => console.log(v), e=> console.error(e)); // Error : rejected

then ๋ฉ”์„œ๋“œ๋Š” ์–ธ์ œ๋‚˜ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋งŒ์•ฝ then ๋ฉ”์„œ๋“œ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๊ทธ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์•„๋‹Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๊ทธ ๊ฐ’์„ ์•”๋ฌต์ ์œผ๋กœ resolve ๋˜๋Š” rejectํ•˜์—ฌ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ƒ์„ฑํ•ด ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Promise.prototype.catch

catch ๋ฉ”์„œ๋“œ๋Š” ํ•œ ๊ฐœ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค. catch ๋ฉ”์„œ๋“œ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ํ”„๋กœ๋ฏธ์Šค๊ฐ€ rejected ์ƒํƒœ์ธ ๊ฒฝ์šฐ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค.

// rejected
new Promise((_, reject) => reject(new Error('rejected')))
	.catch(e => console.log(e)); // Error: rejectd 

catch ๋ฉ”์„œ๋“œ๋Š” then(undefined, onRejected)๊ณผ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ then ๋ฉ”์„œ๋“œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์–ธ์ œ๋‚˜ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Promise.prototype.finally

finally ๋ฉ”์„œ๋“œ๋Š” ํ•œ ๊ฐœ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค. finally ๋ฉ”์„œ๋“œ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ํ”„๋กœ๋ฏธ์Šค์˜ ์„ฑ๊ณต๋˜๋Š” ์‹คํŒจ์™€ ์ƒ๊ด€์—†์ด ๋ฌด์กฐ๊ฑด ํ•œ ๋ฒˆ ํ˜ธ์ถœ๋œ๋‹ค. finally ๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœ๋ฏธ์Šค์˜ ์ƒํƒœ์™€ ์ƒ๊ด€์—†์ด ๊ณตํ†ต์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ฒ˜๋ฆฌ ๋‚ด์šฉ์ด ์žˆ์„ ๋•Œ ์œ ์šฉํ•˜๋‹ค. finally ๋ฉ”์„œ๋“œ๋„ then/catch ๋ฉ”์„œ๋“œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์–ธ์ œ๋‚˜ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

new Promise(() => {})
	.finally(() => console.log('finally')); // finally

ํ”„๋กœ๋ฏธ์Šค์˜ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๐Ÿ˜

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ฝœ๋ฐฑ ํŒจํ„ด์€ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๊ฐ€ ๊ณค๋ž€ํ•˜๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ํ”„๋กœ๋ฏธ์Šค๋Š” ์—๋Ÿฌ๋ฅผ ๋ฌธ์ œ์—†์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋Š” then ๋ฉ”์„œ๋“œ์˜ ๋‘ ๋ฒˆ์งธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

const wrongUrl = 'https://jsonplaceholder.typicode.com/xxx/1';
// ๋ถ€์ ์ ˆํ•œ URL์ด ์ง€์ •๋˜์—ˆ๊ธฐ ๋–„๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
promiseGet(wrongurl).then(
  	res => console.log(res),
 	err => console.error(err)
); // Error: 404

catch๋ฅผ ์‚ฌ์šฉํ•ด ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

const wrongUrl = 'https://jsonplaceholder.typicode.com/xxx/1';

// ๋ถ€์ ์ ˆํ•œ URL์ด ์ง€์ •๋˜์—ˆ๊ธฐ ๋–„๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
promiseGet(wrongUrl)
	.then(res => console.log(res));
	.catch(err => console.error(err)); // Error: 404

catch ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ then(undefined, onRejected)์„ ํ˜ธ์ถœํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ์˜ˆ์ œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฒ˜๋ฆฌ๋œ๋‹ค.

const wrongUrl = 'https://jsonplaceholder.typicode.com/xxx/1';

// ๋ถ€์ ์ ˆํ•œ URL์ด ์ง€์ •๋˜์—ˆ๊ธฐ ๋–„๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
promiseGet(wrongUrl)
	.then(res => console.log(res))
	.then(undefined, err => console.error(err)); // Error : 404

๋‹จ, then ๋ฉ”์„œ๋“œ์˜ ๋‘ ๋ฒˆ์จฐ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์ฒซ ๋ฒˆ์งธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋ฅผ ์บ์น˜ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ ธ์„œ ๊ฐ€๋…์„ฑ์ด ์ข‹์ง€ ์•Š๋‹ค.

catch ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋“  then ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ์ดํ›„์— ํ˜ธ์ถœํ•˜๋ฉด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ then ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๊นŒ์ง€ ๋ชจ๋‘ ์บ์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ then ๋ฉ”์„œ๋“œ์— ๋‘ ๋ฒˆ์จฐ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค catch ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋…์„ฑ์ด ์ข‹๊ณ  ๋ช…ํ™•ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋Š” then ๋ฉ”์„œ๋“œ์—์„œ ํ•˜์ง€ ๋ง๊ณ  catch ๋ฉ”์„œ๋“œ์—์„œ ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

ํ”„๋กœ๋ฏธ์Šค ์ฒด์ด๋‹ ๐Ÿ˜ฎ

ํ”„๋กœ๋ฏธ์Šค๋Š” then, catch, finally ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ฝœ๋ฐฑ ํ—ฌ์„ ํ•ด๊ฒฐํ•œ๋‹ค.

const url = 'https://jsonplaceholder.typicode.com';

// id๊ฐ€ 1์ธ post์˜ userId๋ฅผ ์ทจ๋“
promiseGet(`${url}/posts/1`)
	// ์ทจ๋“ํ•œ post์˜ userId๋กœ user ์ •๋„๋ฅผ ์ทจ๋“
	.then(({ userId }) => promiseGet(`${url}/users/${userId}`))
	.then(userInfo => console.log(userInfo))
	.catch(err => console.error(err));

์œ„ ์˜ˆ์ œ์—์„œ then โ†’ then โ†’ catch ์ˆœ์„œ๋กœ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ–ˆ๋‹ค. then, catch, finally ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ๋Š” ์–ธ์ œ๋‚˜ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์—ฐ์†์ ์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ”„๋กœ๋ฏธ์Šค ์ฒด์ด๋‹์ด๋ผ ํ•œ๋‹ค.

ํ”„๋กœ๋ฏธ์Šค์˜ ์ •์  ๋ฉ”์„œ๋“œ ๐Ÿ™

Promidr๋Š” 5๊ฐ€์ง€ ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

Promise.resolve / Promise.reject

Promise.resolve ์™€ Promise.reject ๋ฉ”์„œ๋“œ๋Š” ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฐ’์„ ๋ž˜ํ•‘ํ•˜์—ฌ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

// ๋ฐฐ์—ด์„ resolveํ•˜๋Š” ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ƒ์„ฑ
const resolvedPromise = Promise.resolve([1,2,3]);
resolvedPromise.then(console.log); // [1,2,3]

์œ„ ์˜ˆ์ œ๋Š” ๋‹ค์Œ ์˜ˆ์ œ์™€ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘

const resolvedPromise = new Promise(resolve => resolve([1,2,3]));
resolvedPromise.then(console.log); // [1,2,3]

Promise.all

Promise.all ๋ฉ”์„œ๋“œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๋ชจ๋‘ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

const requestData1 = () =>
	new Promise(resolve => setTimeout(() => resolve(1), 3000));
const requestData2 = () =>
	new Promise(resolve => setTimeout(() => resolve(2), 2000));
const requestData3 = () =>
	new Promise(resolve => setTimeout(() => resolve(3), 1000));

// ์„ธ ๊ฐœ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ
const res = [];
requestData1()
	.then(data => {
  		res.push(data);
  		return requestData2();
	})
	.then(data => {
  		res.push(data);
  		return requestData3();
	})
	.then(data => {
  		res.push(data);
  		console.log(res); // [1,2,3] ์•ฝ 6์ดˆ ์†Œ์š”
	})
	.catch(console.error);

์œ„ ์˜ˆ์ œ๋Š” ์„ธ ๊ฐœ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ. ์ฆ‰, ์•ž์„  ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒํ•˜๋ฉด ๋‹ค์Œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ์˜ˆ์ œ๋Š” ์ฒซ ๋ฒˆ์จฐ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— 3์ดˆ, ๋‘ ๋ฒˆ์จฐ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— 2์ดˆ, ์„ธ ๋ฒˆ์งธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— 1์ดˆ๊ฐ€ ์†Œ์š”๋˜์–ด ์ด 6์ดˆ ์ด์ƒ ๊ฑธ๋ฆฐ๋‹ค

Promise.all ๋ฉ”์„œ๋“œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๋ชจ๋‘ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. Promise.all ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์„ธ ๊ฐœ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•ด๋ณด์ž

const requestData1 = () =>
  new Promise((resolve) => setTimeout(() => resolve(1), 3000));
const requestData2 = () =>
  new Promise((resolve) => setTimeout(() => resolve(2), 2000));
const requestData3 = () =>
  new Promise((resolve) => setTimeout(() => resolve(3), 1000));

Promise.all([requestData1(), requestData2(), requestData3()])
  .then(console.log) // [ 1, 2, 3 ] โ‡’ ์•ฝ 3์ดˆ ์†Œ์š”
  .catch(console.error);

Promise.all ๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์š”์†Œ๋กœ ๊ฐ–๋Š” ๋ฐฐ์—ด ๋“ฑ์˜ ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ „๋‹ฌ๋ฐ›์€ ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๋ชจ๋‘ fulfilled ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ๋ชจ๋“  ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์—ด์— ์ €์žฅํ•ด ์ƒˆ๋กœ์šด ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ฐ ํ”„๋กœ๋ฏธ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.

  • ์ฒซ ๋ฒˆ์จฐ ํ”„๋กœ๋ฏธ์Šค๋Š” 3์ดˆ ํ›„์— 1์„ resolveํ•œ๋‹ค
  • ๋‘ ๋ฒˆ์งธ ํ”„๋กœ๋ฏธ์Šค๋Š” 2์ดˆ ํ›„์— 2๋ฅผ resolveํ•œ๋‹ค.
  • ์„ธ ๋ฒˆ์งธ ํ”„๋กœ๋ฏธ์Šค๋Š” 1์ดˆ ํ›„์— 3์„ resolveํ•œ๋‹ค.

Promise.all ๋ฉ”์„œ๋“œ๋Š” ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๋ชจ๋‘ fulfilled ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ์ข…๋ฃŒํ•œ๋‹ค.
๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค๊ฐ€ fullfilled ์ƒํƒœ๊ฐ€ ๋˜๋ฉด resolve๋œ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋‘ ๋ฐฐ์—ด์— ์ €์žฅํ•ด ์ƒˆ๋กœ์šด ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋–„ ์ฒซ ๋ฒˆ์จฐ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๊ฐ€์žฅ ๋‚˜์ค‘์— fulfilled ์ƒํƒœ๊ฐ€ ๋˜์–ด๋„ Promise.all ๋ฉ”์„œ๋“œ๋Š” ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ resolve์ธ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๋ฐฐ์—ด์— ์ €์žฅํ•ด ๊ทธ ๋ฐฐ์—ด์„ resolveํ•˜๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
Promise.all ๋ฉ”์„œ๋“œ๋Š” ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ฐฐ์—ด์˜ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ํ•˜๋‚˜๋ผ๋„ rejected ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ๋‚˜๋จธ์ง€ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ fulfilled ์ƒํƒœ๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ์ข…๋ฃŒํ•œ๋‹ค.

Promise.all([
  new Promise((_, reject) =>
    setTimeout(() => reject(new Error("Error 1")), 3000)
  ),
  new Promise((_, reject) =>
    setTimeout(() => reject(new Error("Error 2")), 2000)
  ),
  new Promise((_, reject) =>
    setTimeout(() => reject(new Error("Error 3")), 1000)
  ),
])
  .then(console.log)
  .catch(console.log); // Error: Error 3

์œ„ ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ ์„ธ ๋ฒˆ์งธ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๊ฐ€์ • ๋จผ์ € rejected ์ƒํƒœ๊ฐ€ ๋˜๋ฏ€๋กœ ์„ธ ๋ฒˆ์จฐ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ reject์ธ ์—๋Ÿฌ๊ฐ€ catch ๋ฉ”์„œ๋“œ๋กœ ์ „๋‹ฌ๋œ๋‹ค.
Promise.all ๋ฉ”์„œ๋“œ๋Š” ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์ดํ„ฐ๋Ÿฌ๋ธ”์˜ ์š”์†Œ๊ฐ€ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ Promise.resolve ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํ”„๋กœ๋ฏธ์Šค๋กœ ๋ž˜ํ•‘ํ•œ๋‹ค.

Promise.all([
  1, // => Promise.resolve(1)
  2, // => Promise.resolve(2)
  3, // => Promise.resolve(3)
])
  .then(console.log) // [1, 2, 3]
  .catch(console.log);

Promise.race

Promise.race ๋ฉ”์„œ๋“œ๋Š” Promise.all ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•˜๊ฒŒ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์š”์†Œ๋กœ ๊ฐ–๋Š” ๋ฐฐ์—ด ๋“ฑ์˜ ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค. Promise.race ๋ฉ”์„œ๋“œ๋Š” Promise.all ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค๊ฐ€ fulfilled ์ƒํƒœ๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ€์žฅ ๋จผ์ € fulfilled ์ƒํƒœ๊ฐ€ ๋œ ํ”„๋กœ๋ฏธ์Šค์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ resolveํ•˜๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Promise.race([
  new Promise((resolve) => setTimeout(() => resolve(1), 3000)), // 1
  new Promise((resolve) => setTimeout(() => resolve(2), 2000)), // 2
  new Promise((resolve) => setTimeout(() => resolve(3), 1000)), // 3
])
  .then(console.log) // 3
  .catch(console.log);

ํ”„๋กœ๋ฏธ์Šค๊ฐ€ rejected ์ƒํƒœ๊ฐ€ ๋˜๋ฉด Promise.all ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋œ๋‹ค. ์ฆ‰ Promise.race ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌ๋œ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ํ•˜๋‚˜๋ผ๋„ rejected ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ์—๋Ÿฌ๋ฅผ rejectํ•˜๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Promise.race([
  new Promise((_, reject) =>
    setTimeout(() => reject(new Error("Error 1")), 3000)
  ),
  new Promise((_, reject) =>
    setTimeout(() => reject(new Error("Error 2")), 2000)
  ),
  new Promise((_, reject) =>
    setTimeout(() => reject(new Error("Error 3")), 1000)
  ),
])
  .then(console.log)
  .catch(console.log); // Error: Error 3

Promise.allSettled

Promise.allSettled ๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์š”์†Œ๋กœ ๊ฐ–๋Š” ๋ฐฐ์—ด ๋“ฑ์˜ ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ „๋‹ฌ๋ฐ›์€ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๋ชจ๋‘ settled ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ES11์— ๋„์ž…๋œ Promise.allSettled ๋ฉ”์„œ๋“œ๋Š” IE๋ฅผ ์ œ์™ธํ•จ ๋Œ€๋ถ€๋ถ„์˜ ๋ชจ๋˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›ํ•œ๋‹ค.

Promise.allSettled([
  new Promise((resolve) => setTimeout(() => resolve(1), 2000)),
  new Promise((_, reject) =>
    setTimeout(() => reject(new Error("Error!")), 1000)
  ),
]).then(console.log);
/*
[
  {status: "fulfilled", value: 1},
  {status: "rejected", reason: Error: Error! at <anonymous>:3:54}
]
*/

๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ ๐Ÿ˜ƒ

๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์–ด๋–ค ์ˆœ์„œ๋กœ ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋ ์ง€ ์ƒ๊ฐํ•ด๋ณด์ž.

setTimeout(() => console.log(1), 0);

Promise.resolve()
  .then(() => console.log(2))
  .then(() => console.log(3));

ํ”„๋กœ๋ฏธ์Šค์˜ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ๋„ ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๋ฏ€๋กœ 1 โ†’ 2 โ†’ 3์˜ ์ˆœ์œผ๋กœ ์ถœ๋ ฅ๋  ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ 2 โ†’ 3 โ†’ 1์˜ ์ˆœ์œผ๋กœ ์ถœ๋ ฅ๋œ๋‹ค. ๊ทธ ์ด์œ ๋Š” ํ”„๋กœ๋ฏธ์Šค์˜ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ํƒœ์Šคํฌ ํ๊ฐ€ ์•„๋‹ˆ๋ผ ๋งˆ์ดํฌ ๋กœํƒœ์Šคํฌ ํ์— ์ €์žฅ๋˜๊ธฐ ๋–„๋ฌธ์ด๋‹ค.

๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ๋Š” ํƒœ์Šคํฌ ํ์™€๋Š” ๋ณ„๋„์˜ ํ๋‹ค. ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ์—๋Š” ํ”„๋กœ๋ฏธ์Šค์˜ ํ”„๋กœ๋ฏธ์Šค์˜ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์ผ์‹œ ์ €์žฅ๋œ๋‹ค. ๊ทธ ์™ธ์˜ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋‚˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ํƒœ์Šคํฌ ํ์— ์ผ์‹œ ์ €์žฅ๋œ๋‹ค.

์ฝœ๋ฐฑ ํ•จ์ˆ˜๋‚˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ผ์‹œ ์ €์žฅํ•œ๋‹ค๋Š” ์ ์—์„œ ํƒœ์Šคํฌ ํ์™€ ๋™์ผํ•˜์ง€๋งŒ ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ๋Š” ํƒœ์Šคํฌ ํ๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค ์ฆ‰, ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ์ฝœ ์Šคํƒ์ด ๋น„๋ฉด ๋จผ์ € ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ์—์„œ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€ ์‹คํ–‰ํ•œ๋‹ค. ์ดํ›„ ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ๊ฐ€ ๋น„๋ฉด ํƒœ์Šคํฌ ํ์—์„œ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€ ์‹คํ–‰ํ•œ๋‹ค.

๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ โญ

fetch ํ•จ์ˆ˜๋Š” XMLHttpRequest ๊ฐ์ฑ„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ HTTP ์š”์ฒญ ์ „์†ก ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ Web API๋‹ค. fetch ํ•จ์ˆ˜๋Š” XMLHttpRequest ๊ฐ์ฑ„๋ณด๋‹ค ์‚ฌ์šฉ๋ฒ•์ด ๊ฐ„๋‹จํ•˜๊ณ  ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋–„๋ฌธ์— ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ฝœ๋ฐฑ ํŒจํ„ด์˜ ๋‹จ์ ์—์„œ ์ž์œ ๋กญ๋‹ค. fetch ํ•จ์ˆ˜๋Š” ๋น„๊ต์  ์ตœ๊ทผ์— ์ถ”๊ฐ€๋œ Web API๋กœ์„œ ์ธํ„ฐ๋„ท ์ต์Šคํ”Œ๋กœ๋Ÿฌ๋ฅผ ์ œ์™ธํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๋ชจ๋˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณต.

fetch ํ•จ์ˆ˜์—๋Š” HTTP ์š”์ฒญ์„ ์ „์†กํ•  URL๊ณผ HTTP ์š”์ฒญ ๋ฉ”์„œ๋“œ, HTTP ์š”์ฒญ ํ—ค๋”, ํŽ˜์ด๋กœ๋“œ ๋“ฑ์„ ์„ค์ •ํ•œ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ.

const promise = fetch(url [, options])

fetch ํ•จ์ˆ˜๋Š” HTTP ์‘๋‹ต์„ ๋‚˜ํƒ€๋‚ด๋Š” Response ๊ฐ์ฒด๋ฅผ ๋ž˜ํ•‘ํ•œ Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค

fetch('https://jsonplaceholder.typicode.com/todos/1')
	.then(response => console.log(response));

fetch ํ•จ์ˆ˜๋Š” HTTP ์‘๋‹ต์„ ๋‚˜ํƒ€๋‚ด๋Š” Response ๊ฐ์ฒด๋ฅผ ๋ž˜ํ•‘ํ•œ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ thne์„ ํ†ตํ•ด ํ”„๋กœ๋ฏธ์Šค๊ฐ€ resolveํ•œ Response ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. Response ๊ฐ์ฒด๋Š” HTTP ์‘๋‹ต์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋‹ค์–‘ํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

Response.prototype์—๋Š” Response ๊ฐ์ฒด์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” HTTP ์‘๋‹ต ๋ชธ์ฒด(response.body)๋ฅผ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, fetch ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๋ž˜ํ•‘ํ•˜๊ณ  ์žˆ๋Š” MIME ํƒ€์ž…์ด application/json์ธ HTTP ์‘๋‹ต ๋ชธ์ฒด๋ฅผ ์ทจ๋“ํ•˜๋ ค๋ฉด Response.prototype.json ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
Response.prototype.json ๋ฉ”์„œ๋“œ๋Š” Response ๊ฐ์ฒด์—์„œ HTTP ์‘๋‹ต ๋ชธ์ฒด๋ฅผ ์—ญ์ง๋ ฌํ™”ํ•œ๋‹ค.
fetch ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋–„๋Š” ์—๋Ÿฌ ์ฒ˜๋ฆฌ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

fetch("https://jsonplaceholder.typicode.com/todos/1")
  // response๋Š” HTTP ์‘๋‹ต์„ ๋‚˜ํƒ€๋‚ด๋Š” Response ๊ฐ์ฒด์ด๋‹ค.
  // json ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Response ๊ฐ์ฒด์—์„œ HTTP ์‘๋‹ต ๋ชธ์ฒด๋ฅผ ์ทจ๋“ํ•˜์—ฌ ์—ญ์ง๋ ฌํ™”ํ•œ๋‹ค.
  .then((response) => response.json())
  // json์€ ์—ญ์ง๋ ฌํ™”๋œ HTTP ์‘๋‹ต ๋ชธ์ฒด์ด๋‹ค.
  .then((json) => console.log(json));
// {userId: 1, id: 1, title: "delectus aut autem", completed: false}

fetch ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋–„๋Š” ์—๋Ÿฌ ์ฒ˜๋ฆฌใ…” ์ฃผ์˜

const wrongUrl = 'https://jsonplaceholder.typicode.com/xxx/1';

// ๋ถ€์ ์ ˆํ•œ URL์ด ์ €์žฅ๋˜์—ˆ๊ธฐ ๋–„๋ฌธ์— 404 Not Found ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
fetch(wrongUrl)
	.then(() => console.log('ok'))
	.cach(() => console.log('error'));

fetch ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ”„๋กœ๋ฏธ์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 404 Not Found๋‚˜ 500 Internal Server Error์™€ ๊ฐ™์€ HTTP ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์—๋Ÿฌ๋ฅผ rejectํ•˜์ง€ ์•Š๊ณ  ๋ถˆ๋ฆฌ์–ธ ํƒ€์ž…์˜ ok ์ƒํƒœ๋ฅผ false๋กœ ์„ค์ •ํ•œ Response ๊ฐ์ฒด๋ฅผ resolveํ•œ๋‹ค. ์˜คํ”„๋ผ์ธ ๋“ฑ์˜ ๋„คํŠธ์›Œํฌ ์žฅ์• ๋‚˜ CORS ์—๋Ÿฌ์— ์˜ํ•ด ์š”์ฒญ์ด ์™„๋ฃŒ๋˜์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ์—๋งŒ ํ”„๋กœ๋ฏธ์Šค๋ฅผ rejectํ•œ๋‹ค.

๋”ฐ๋ผ์„œ fetch ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด fetch ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ resolveํ•œ ๋ถˆ๋ฆฌ์–ธ ํƒ€์ž…์˜ ok ์ƒํƒœ๋ฅผ ํ™•์ธํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

const wrongUrl = 'https://jsonplaceholder.typicode.com/xxx/1';

// ๋ถ€์ ์ ˆํ•œ URL์ด ์ €์žฅ๋˜์—ˆ๊ธฐ ๋–„๋ฌธ์— 404 Not Found ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค
fetch(wrongUrl)
	// response๋Š” HTTP ์‘๋‹ต์„ ๋‚˜ํƒ€๋‚ด๋Š” Response ๊ฐ์ฒด๋‹ค.
	.then(response => {
  		if(!response.ok) throw new Error(response.statusText);
  		return response.json();
	})
	.then(todo => console.log(todo));
	.catch(err => console.error(err));

์ฐธ๊ณ ๋กœ axios๋Š” ๋ชจ๋“  HTTP ์—๋Ÿฌ๋ฅผ rejcetํ•˜๋Š” ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ์—๋Ÿฌ๋ฅผ catch์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ํŽธ๋ฆฌํ•˜๋‹ค. axios๋Š” ์ธํ„ฐ์…‰ํ„ฐ, ์š”์ฒญ ์„ค์ • ๋“ฑ fetch๋ณด๋‹ค ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค.

GET ์š”์ฒญ

request.get('https://jsonplaceholder.typicode.com/todos/1')
	.then(response => {
  		if(!response.ok) throw new Error(response.statusTexT);
  		return response.json();
	})
	.then(todos => console.log(todos))
	.catch(err => console.log(err));
// {userId : 1, id: 1, title: "delectus aut autem", completed: false}

POST ์š”์ฒญ

request.post('https://jsonplaceholder.typicode.com/todos', {
  userId: 1,
  title: 'JavaScript',
  completed: false
}).then(response => {
	if(!response.ok) throw new Error(response.statusText);
  	return response.json();
	})
	.then(todos => console.log(todos))
	.catch(err => console.error(err));
// {userId: 1, title: "JavaScript", completed: false, id: 201}

PATCH ์š”์ฒญ

request.post('https://jsonplaceholder.typicode.com/todos', {
  completed: true
}).then(response => {
  	if (!response.ok) throw new Error(response.statusText);
  	return response.json();
	})
	.then(todos => console.log(todos))
	.catch(err => console.error(err));
// {userId: 1, id: 1, title: "delectus aut autem", completed: true}

DELETE ์š”์ฒญ

request.delete('https://jsonplaceholder.typicode.com/todos/1')
	.then(response => {
  		if(!response.ok) throw new Error(response.statusText);
  		return response.json();
	})
	.then(todos => console.log(todos))
	.catch(err => console.error(err));
profile
FrontEnd Developer

0๊ฐœ์˜ ๋Œ“๊ธ€