🦎[λ”₯λ‹€μ΄λΈŒ μŠ€ν„°λ””] 46μž₯. μ œλ„ˆλ ˆμ΄ν„°μ™€ async/await

이지·2021λ…„ 10μ›” 24일
0

DeepDive

λͺ©λ‘ 보기
9/13

1. μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜κ°€ 싀행될 λ•Œ λ°˜ν™˜ν•˜λŠ” μ œλ„ˆλ ˆμ΄ν„° 객체가 κ°–λŠ” λ©”μ„œλ“œμ™€ λ©”μ„œλ“œμ˜ λ™μž‘μ„ 각각 μ„€λͺ…ν•΄λ³΄μ‹œμ˜€.

μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜κ°€ 호좜되면 μ œλ„ˆλ ˆμ΄ν„° 객체가 μƒμ„±λœλ‹€. μ΄λŠ” symbol.iterator λ©”μ„œλ“œλ₯Ό 상속 λ°›λŠ” μ΄ν„°λŸ¬λΈ”μ΄λ©΄μ„œ, λ™μ‹œμ— next λ©”μ„œλ“œλ₯Ό κ°–λŠ” μ΄ν„°λ ˆμ΄ν„°μ΄λ‹€.

κ·ΈλŸ¬λ‚˜ μ΄ν„°λ ˆμ΄ν„°μ—λŠ” μ—†λŠ” return, throw 의 λ©”μ„œλ“œλ₯Ό μΆ”κ°€λ‘œ κ°–λŠ”λ‹€.

  1. next λ₯Ό ν˜ΈμΆœν•˜λ©΄, yield ν‘œν˜„μ‹κΉŒμ§€ μ½”λ“œλΈ”λ‘μ„ μ‹€ν–‰ν•˜κ³  yield된 값을 valueν”„λ‘œνΌν‹° κ°’μœΌλ‘œ, falseλ₯Ό done ν”„λ‘œνΌν‹° κ°’μœΌλ‘œ κ°–λŠ” μ΄ν„°λ ˆμ΄ν„° 리절트 객체λ₯Ό λ°˜ν™˜ν•œλ‹€.

  2. return λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ 인수둜 전달받은 값을 valueν”„λ‘œνΌν‹° κ°’μœΌλ‘œ, true λ₯Ό done ν”„λ‘œνΌν‹° κ°’μœΌλ‘œ κ°–λŠ” μ΄ν„°λ ˆμ΄ν„° 리절트 객체λ₯Ό λ°˜ν™˜ν•œλ‹€.

  3. throw λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ 인수둜 전달받은 μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€κ³ , undefined λ₯Ό value ν”„λ‘œνΌν‹° κ°’μœΌλ‘œ, true λ₯Ό done ν”„λ‘œνΌν‹° κ°’μœΌλ‘œ κ°–λŠ” μ΄ν„°λ ˆμ΄ν„° 리절트 객체λ₯Ό λ°˜ν™˜ν•œλ‹€.

2. μ•„λž˜μ˜ μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν–ˆμ„ λ•Œ 각 μ½˜μ†”μ΄ 좜λ ₯ν•˜λŠ” 값은 무엇일지 μ„€λͺ…ν•΄λ³΄μ‹œμ˜€.

function* getFunc() {
  try { 
    yield 1;
    yield 2;
  } catch(e) {
    console.error(e);
  }
}
const generator = getFunc();
console.log(generator.next()); {value:1 , done: false}
console.log(generator.next()); {value:2,  done: false}
//console.log(generator.next()); {value:undefined,  done: true}
console.log(generator.throw('Error!')); {value:"Error", done: true} 

3. μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜λž€ 무엇이며 일반 ν•¨μˆ˜μ™€μ˜ μ°¨μ΄λŠ” 무엇인지 νŠΉμ§•μ„ μ„€λͺ…ν•΄λ³΄μ‹œμ˜€.

  1. μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜λŠ” ν•¨μˆ˜ ν˜ΈμΆœμžμ— μ‹€ν–‰ μ œμ–΄κΆŒμ„ 양도할 수 μžˆλ‹€. μΌλ°˜ν•¨μˆ˜λŠ” ν•¨μˆ˜ν˜ΈμΆœ 이후 ν•¨μˆ˜μ‹€ν–‰μ„ μ œμ–΄ν•  수 μ—†μ§€λ§Œ μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜λŠ” κ°€λŠ₯ν•˜λ‹€. 즉 μΌμ‹œ μ€‘μ§€ν•˜κ±°λ‚˜ 재개 μ‹œν‚¬ 수 있음.
  2. μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜λŠ” ν•¨μˆ˜ν˜ΈμΆœμžμ™€ ν•¨μˆ˜μ˜ μƒνƒœλ₯Ό μ£Όκ³  받을 수 있음. μΌλ°˜ν•¨μˆ˜λŠ” ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λŠ” λ™μ•ˆμ— ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ λ‚΄λΆ€λ‘œ 값을 μ „λ‹¬ν•˜μ—¬ μƒνƒœλ₯Ό λ³€κ²½μ‹œν‚¬ 수 μ—†μ§€λ§Œ μ œλ„ˆλ ˆμ΄ν„°λŠ” ν˜ΈμΆœμžμ™€ μ–‘λ°©ν–₯으둜 μƒνƒœλ₯Ό μ£Όκ³  받을 수 있음.
  3. μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜μ—¬ μ–΄λ–€ 값을 λ°˜ν™˜ν•˜λŠ”κ²ƒμ΄ μ•„λ‹ˆλΌ μ΄ν„°λŸ¬λΈ”μ΄λ©΄μ„œ λ™μ‹œμ— μ΄ν„°λ ˆμ΄ν„°μΈ μ œλ„ˆλ ˆμ΄ν„° 객체λ₯Ό λ°˜ν™˜ν•œλ‹€.

1. μ•„λž˜μ˜ μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν–ˆμ„ λ•Œ 각 μ½˜μ†”μ΄ 좜λ ₯ν•˜λŠ” 값은 무엇일지 μ„€λͺ…ν•΄λ³΄μ‹œμ˜€.

function* getFunc(){

const x = yield 1;
const y = yield (x+10);

return (x+y)*x;
}

const generator = getFunc();

let res = generator.next();

1. console.log(res);  // {value: 1, done: false}

res = generator.next(100);

2. console.log(res); // {value: 110, done: false}

res = generator.next(30);

3. console.log(res); // {value: 13000, done: true}

//generator의 λ‚΄λΆ€ λ³€μˆ˜μΈ xλŠ” 첫번째 next() μ‹€ν–‰μ‹œμ— yield 값을 λ°˜ν™˜ν•œλ‹€.
//λ‘λ²ˆμ§Έ next() μ‹€ν–‰μ‹œ μ „λ‹¬λœ μΈμžκ°€ x의 κ°’μœΌλ‘œ μ •μ˜λœλ‹€.

2. μ œλ„ˆλ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μŒ ν•¨μˆ˜λ₯Ό κ°„λ‹¨νžˆ μ΄ν„°λŸ¬λΈ”λ‘œ κ΅¬ν˜„ν•΄λ³΄μž!

const infiniteFibonacci = (function() {
	let [pre,cur] = [0,1];

	return {
		[Symbol.iterator]() { return this; },
		next() {
		[pre,cur] = [cur,pre+cur];
		return {value: cur};
		}
	};
}());

//infiniteFibonachi λŠ” λ¬΄ν•œ μ΄ν„°λŸ¬λΈ”μ΄λ‹€. 
for (const num of infiniteFibonacci) {
	if(num > 10000) break;
	console.log(num);
}

//μ œλ„ˆλ ˆμ΄ν„°λ‘œ κ΅¬ν˜„
const infiniteFibonacci = (function* () {
  let [pre, cur] = [0, 1];
  while(true) {
    [pre, cur] = [cur, pre + cur];
    yield cur;
  }
})();

for (const num of infiniteFibonacci) {
  if (num > 10000) break;
  console.log(num);
}

3. ν•¨μˆ˜μ˜ μ‹€ν–‰κ²°κ³Ό console에 λ‚˜νƒ€λ‚˜λŠ” 값은 ? async ν•¨μˆ˜λŠ” 무엇을 λ°˜ν™˜ν•˜λŠ”κ°€?

async function a(n) {return n*n};
a(10).then(res=>console.log(res)); //100

class MyClass{
	async bar(n) {return n}
}

const myClass = new MyClass();
myClass.bar(10).then(res=>console.log(res)); //10

//각각의 async ν‚€μ›Œλ“œλ‘œ 인해 비동기 ν•¨μˆ˜μ²˜λŸΌ λ™μž‘ν•œλ‹€.
//ν•¨μˆ˜μ˜ μ‹€ν–‰ 결과둜 ν•¨μˆ˜λŠ” λ°˜ν™˜κ°’μ„ resolveν•˜λŠ” ν”„λ‘œλ―ΈμŠ€λ₯Ό λ°˜ν™˜ν•˜κ³ 
//then λ©”μ„œλ“œμ˜ 첫번째 인자둜 λ„˜κ²¨μ§„ 콜백이 μ‹€ν–‰λœλ‹€.

4. 좜λ ₯λ˜λŠ” res κ°’κ³Ό, 좜λ ₯λ•ŒκΉŒμ§€ μ†Œμš”λ˜λŠ” 총 μ‹œκ°„μ€?

async function foo() {
//화면에 ν•œλ²ˆμ— λ°›μ•„μ˜¬ λ•Œ! 
	const res = await Promise.all([
		new Promise(res=>setTimeout(()=>res(1),3000)),
		new Promise(res=>setTimeout(()=>res(2),2000)),
		new Promise(res=>setTimeout(()=>res(3),1000)),
	]);
	console.log(res);
}

foo(); //[1, 2, 3] μ•½ 3초 정도 κ±Έλ¦°λ‹€.

//Promise.all ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•  경우, λͺ¨λ“  비동기 ν•¨μˆ˜κ°€ λ³‘λ ¬μ μœΌλ‘œ μ‹€ν–‰λœλ‹€.
//μ²˜λ¦¬μ‹œκ°„μ΄ κ°€μž₯ 였래 κ±Έλ¦¬λŠ” 비동기 처리 ν•¨μˆ˜μ˜ μˆ˜ν–‰μ‹œκ°„μ΄ 전체 비동기 처리의 μ‹œκ°„κ³Ό λΉ„μŠ·ν•˜λ‹€.
//λͺ¨λ“  μ²˜λ¦¬κ°€ λλ‚œν›„μ—λŠ” μ²˜μŒμ— λ‹΄κΈ΄ μˆœμ„œλŒ€λ‘œ μ‹€ν–‰λœ 결과값을 배열에 λ‹΄μ•„ λ°˜ν™˜ν•œλ‹€.

5. λ‹€μŒ μ˜ˆμ œμ—μ„œ μ—λŸ¬λ₯Ό μΊμΉ˜ν•˜μ§€ λͺ»ν•˜λŠ” 이유λ₯Ό 호좜자 ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„€λͺ…ν•΄λ³΄μ‹œμ˜€.

try {
	setTimeout(()=>{throw new Error("err!")}, 1000);
} catch(e){
	console.error('err', e);
}

async function a() {

	try{
		const url ="https://";
		const res = await fetch(url)
		const data = await res.json()
		console.log(data);
}
	catch(err){
		console.error(err);
}

}

a();

//setTimeout ν•¨μˆ˜λŠ” 비동기 ν•¨μˆ˜λ‘œ ν•¨μˆ˜λŠ” μ‹€ν–‰λ˜λŠ” μˆœκ°„ μ½œμŠ€νƒμ—μ„œ μ œκ±°λœλ‹€.
//μ΄λ•Œ 이 ν•¨μˆ˜κ°€ 인자둜 μ „λ‹¬ν•œ μ½œλ°±ν•¨μˆ˜λŠ” λΈŒλΌμš°μ €κ°€ 이벀트λ₯Ό μœ„μž„λ°›μ•„ μ‹€ν–‰ν•œλ‹€.
//ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μΈ μ—λŸ¬λŠ” μƒμœ„ 호좜자λ₯Ό μ°Ύμ•„ μ „λ‹¬λœλ‹€.
//μ½œμŠ€νƒμ—λŠ” ν•΄λ‹Ή μ—λŸ¬μ˜ 호좜자둜 μ˜ˆμƒλ˜λŠ” 주체가 μ—†μ–΄ try catch문이 μ •μƒμ μœΌλ‘œ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.
//κ²°κ΅­, μ—λŸ¬κ°€ λ°œμƒν•œ 것을 catchν•˜μ§€ λͺ»ν•˜λŠ” side effect이 λ°œμƒλœλ‹€.
//μ‹€μ œ μ‹€ν–‰ν•˜λ©΄ error: message: "Uncaught Error: err!"κ°€ 찍힘
profile
μ΄μ§€ν”Όμ§€λ ˆλͺ¬μŠ€ν€΄μ§€πŸ‹

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보