๐Ÿช„ Ajax

Promise

"์•ฝ์†"

// ์ปคํ”ผ๋ฅผ ์ฃผ๋ฌธํ•˜๋Š” ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค
// ์ƒ์„ฑ์ž์—๋Š” ์•ฝ์†์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•œ resolve ํ•จ์ˆ˜์™€, ์•ฝ์†์„ ์ง€ํ‚ค์ง€ ๋ชปํ–ˆ์„ ๋•Œ๋ฅผ ๋Œ€๋น„ํ•œ reject ํ•จ์ˆ˜(executor ํ•จ์ˆ˜)๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌํ•œ๋‹ค
const orderCoffee = new Promise((resolve, reject) => {

  const requestObj = new XMLHttpRequest();
  requestObj.open('GET', 'orderCoffee.txt');
  requestObj.onreadystatechange = () => {
      if (requestObj.readyState === 4 && requestObj.status === 200) {
          const result = requestObj.responseText;

          // resolve ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด then ๋ฉ”์†Œ๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค
          resolve(result);

          // resolve ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์ด ์—†๋Š” ์ƒํƒœ์—์„œ reject ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ํ†ต์‹ ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด catch ๋ฉ”์†Œ๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค
          // reject(result);
      }
  };
  requestObj.send();
});

// then ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๋งˆ์น˜ ๋™๊ธฐ์ ์ธ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค

// resolve ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋ ๋•Œ ์ „๋‹ฌ๋œ ์ธ์ž(๋น„๋™๊ธฐ ํ†ต์‹  ๊ฒฐ๊ณผ)๋Š” then ๋ฉ”์†Œ๋“œ์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ๋‹ค
orderCoffee.then((asyncResult) => {
  console.log(asyncResult);
  console.log('์•ฝ์†์ด ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค.');
  return asyncResult; 
}).catch((error) => { // then ๋ฉ”์†Œ๋“œ๋Š” ํ”„๋ผ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— catch ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์–ด์„œ ์“ฐ๋Š”๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค
  console.log(new Error('์ปคํ”ผ์ฃผ๋ฌธ์ด ์ •์ƒ์ ์œผ๋กœ ์ด๋ค„์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.'));
})

๐Ÿ’ก resolve ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๋Š” ์ธ์ž๋Š” ๋น„๋™๊ธฐ ํ†ต์‹ ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋งž์ง€๋งŒ promise์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋Š” ์•„๋‹ˆ๋‹ค. promise์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋Š” then ๋ฉ”์†Œ๋“œ ์•ˆ์—์„œ ์ด๋ฃจ์–ด์ง„๋‹ค. promise๋Š” ์„œ๋ฒ„ ํ†ต์‹ ๊ณผ ์ง์ ‘์ ์ธ ๊ด€๋ จ์€ ์—†๋‹ค.

fetch

XMLHttpRequest๋ฅผ ๋Œ€์ฒดํ•  ์ƒˆ๋กœ์šด API ๋“ฑ์žฅ

let result = fetch('https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json');
console.log(result);	// ๋จผ์ € ์‹คํ–‰๋ผ์„œ Promise {<pending>}

fetch๋Š” ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. fetch ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฐ”๋กœ ์ธ์ž๋กœ ์ „๋‹ฌํ•œ url์— ์ ‘๊ทผํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๋Š”๋‹ค. ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋ฐ”๋กœ fulfilled ์ƒํƒœ์˜ promise๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.

let result = fetch('https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json');
result.then((data) => {
    console.log(data);
}

fulfilled ์ƒํƒœ์˜ promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— then์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฝ˜์†”์„ ๋ณด๋ฉด ์ด๋ฒˆ์—๋Š” Response๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. Response ๊ฐ์ฒด์—๋Š” ์š”์ฒญ์— ๋Œ€ํ•œ ์ข…ํ•ฉ์ ์ธ ์‘๋‹ต ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ๊ฒƒ์€ JSON ๋ฐ์ดํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— .json() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•œ promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ ํ•œ๋ฒˆ ๋” then ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์•ผ ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฝ‘์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

let result = fetch('https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json');
result.then((data) => {
	return data.json()
})
	.then((result) => {
		console.log(result);
		return result;
	})
	.catch((result) => {
		console.log(new Error(result));
	});

async, await

async ํ‚ค์›Œ๋“œ๋Š” ์–ด๋–ค ํ•จ์ˆ˜๋“  ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. (์‹ฌ์ง€์–ด return ํ‚ค์›Œ๋“œ๊ฐ€ ์—†์–ด๋„!)

async function test(){}
console.log(test());	// Promise {<fulfilled>: undefined}

await ํ‚ค์›Œ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ async ํ•จ์ˆ˜ ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
await๋Š” async ํ•จ์ˆ˜์•ˆ์—์„œ promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค์ง€ ์•Š๊ณ  ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋ผ๋ฏธ์Šค ๊ฐ์ฒด์˜ fulfilled ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

async function message() {
    let hello = await new Promise((resolve) => {
        setTimeout(() => {
            resolve('hello');	// hello ๋ฐ˜ํ™˜
        }, 100)
    })

    let world = await new Promise((resolve) => {
        setTimeout(() => {
            resolve('world');	// world ๋ฐ˜ํ™˜
        }, 100)
    })

    console.log(`${hello} ${world}`);
}

message();	
// Promise {<pending>}
// hello world

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