🐯 콜백 ν•¨μˆ˜

AprilΒ·2021λ…„ 8μ›” 7일
0

✨Javascript

λͺ©λ‘ 보기
13/45
post-thumbnail

개인 곡뢀λ₯Ό μœ„ν•΄ μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€


콜백 ν•¨μˆ˜λž€?

콜백 ν•¨μˆ˜(callback function)λž€, λ‹€λ₯Έ μ½”λ“œμ˜ 인자둜 λ„˜κ²¨μ£ΌλŠ” ν•¨μˆ˜

콜백 ν•¨μˆ˜λ₯Ό λ„˜κ²¨λ°›μ€ μ½”λ“œλŠ” 이 콜백 ν•¨μˆ˜μ—κ²Œ μ œμ–΄κΆŒμ„ λ„˜κ²¨ μ£Όλ©°, 콜백 ν•¨μˆ˜λŠ” ν•„μš”μ— 따라 μ μ ˆν•œ μ‹œμ μ— μ‹€ν–‰ν•œλ‹€.


:: βœ¨μ œμ–΄κΆŒ

예제)

let count = 0;
const cbFunc = () => {
	console.log(count);
  	if (++count > 4) clearInterval(time);
};

const timer = setInterval(cbFunc, 300);
// μ‹€ν–‰ κ²°κ³Ό
// 0 (0.3초)
// 1 (0.6초)
// 2 (0.9초)
// 3 (1.2초)
// 4 (1.5초)

예제λ₯Ό 톡해 μ½”λ“œ μ‹€ν–‰ 방식과 μ œμ–΄κΆŒμ„ μ‚΄νŽ΄λ³΄λ©΄,

code호좜 μ£Όμ²΄μ œμ–΄κΆŒ
cbFunc();μ‚¬μš©μžμ‚¬μš©μž
setInterval(cbFunc, 300);setIntervalsetInterval
  • setInterval이라고 ν•˜λŠ” 'λ‹€λ₯Έ μ½”λ“œ'에 첫 번째 μΈμžλ‘œμ„œ cbFunc ν•¨μˆ˜λ₯Ό λ„˜κ²¨μ£Όμž
  • μ œμ–΄κΆŒμ„ λ„˜κ²¨λ°›μ€ setInterval이 슀슀둜의 νŒλ‹¨μ— 따라 μ μ ˆν•œ μ‹œμ μ—(0.3초 λ§ˆλ‹€) 이 ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν–ˆλ‹€.
  • 콜백 ν•¨μˆ˜μ˜ μ œμ–΄κΆŒμ„ λ„˜κ²¨λ°›μ€ μ½”λ“œλŠ” 콜백 ν•¨μˆ˜ 호좜 μ‹œμ μ— λŒ€ν•œ μ œμ–΄κΆŒμ„ 가진닀.
  • μ œμ–΄κΆŒμ„ λ„˜κ²¨λ°›μ€ μ½”λ“œλŠ” 콜백 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ μΈμžμ— μ–΄λ–€ 값듀을 μ–΄λ–€ μˆœμ„œλ‘œ λ„˜κΈΈ 것인지에 λŒ€ν•œ μ œμ–΄κΆŒλ„ 가진닀.

:: βœ”οΈμ½œλ°± ν•¨μˆ˜λ„ ν•¨μˆ˜λ‹€

const obj = {
	vals: [1, 2, 3],
  	logValues: (v, i) => {
    	console.log(v, i)
    };
};
obj.logValues(1, 2); // (1)
// {vals:[1, 2, 3], logValues: f} 1 2
[4, 5, 6].forEach(obj.logValues);  // (2)
// Window {...} 4 0			  
// Window {...} 5 1			  
// Window {...} 6 2

(1) 이름 μ•žμ— 점(.)이 μžˆμœΌλ‹ˆ λ©”μ„œλ“œλ‘œμ„œ 호좜
  βž” 이 λ•Œμ˜ thisλŠ” obj
(2) ν•¨μˆ˜λ§Œ 전달 받은 κ²ƒμœΌλ‘œ, obj와 연관이 없어진닀.
  βž” 이 λ•Œμ˜ thisλŠ” μ „μ—­ 객체(window)

βž” 콜백 ν•¨μˆ˜ λ‚΄λΆ€μ˜ this에 λ‹€λ₯Έ κ°’ λ°”μΈλ”©ν•˜κΈ°

λ³„λ„μ˜ 인자둜 thisλ₯Ό λ°›λŠ” ν•¨μˆ˜μ˜ κ²½μš°μ—λŠ” μ›ν•˜λŠ” 값을 λ„˜κ²¨μ£Όλ©΄ λ˜μ§€λ§Œ, 그렇지 μ•Šμ€ κ²½μš°μ—λŠ” this의 μ œμ–΄κΆŒλ„ λ„˜κ²¨μ£Όκ²Œ λ˜λ―€λ‘œ μ‚¬μš©μžκ°€ μž„μ˜λ‘œ λ°”κΏ€ 수 μ—†λ‹€.

:: 콜백 ν•¨μˆ˜ λ‚΄λΆ€μ˜ this에 λ‹€λ₯Έ 값을 바인딩 ν•˜λŠ” 방법

(1) λ³€μˆ˜μ— λ‹΄κΈ°

(전톡적인 방식) 잘 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€ ❌
콜백 ν•¨μˆ˜λ‘œ ν™œμš©ν•  ν•¨μˆ˜μ—μ„œλŠ” thisλ₯Ό λ‹€λ₯Έ λ³€μˆ˜μ— λ‹΄μ•„ this λŒ€μ‹  κ·Έ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜κ²Œ ν•˜κ³ , 이λ₯Ό ν΄λ‘œμ €λ‘œ λ§Œλ“œλŠ” 방식이 많이 μ“°μ˜€λ‹€.


(2) bind λ©”μ„œλ“œ ν™œμš© +ES5

const obj = {
	name: 'yrKim',
  	func: () => console.log(this.name);
};

setTimeout(obj.func.bind(obj), 1000); 

const obj2 = { name: 'april' }
setTimeout(obj.func.bind(obj2), 1500); 

:: 🚩 콜백 지μ˜₯κ³Ό 비동기 μ œμ–΄

콜백 지μ˜₯(callback hell)은 콜백 ν•¨μˆ˜λ₯Ό 읡λͺ… ν•¨μˆ˜λ‘œ μ „λ‹¬ν•˜λŠ” 과정이 λ°˜λ³΅λ˜μ–΄ μ½”λ“œμ˜ λ“€μ—¬μ“°κΈ° μˆ˜μ€€μ΄ κ°λ‹Ήν•˜κΈ° νž˜λ“€ μ •λ„λ‘œ κΉŠμ–΄μ§€λŠ” ν˜„μƒμœΌλ‘œ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ν”νžˆ λ°œμƒν•˜λŠ” 문제..πŸ₯²πŸ₯²

βž” 비동기적인 μ½”λ“œ: μ¦‰μ‹œ 싀행이 ❌ μ•„λ‹Œ, β€€ λ³„λ„μ˜ μš”μ²­, μ‹€ν–‰ λŒ€κΈ°, 보λ₯˜ λ“±κ³Ό κ΄€λ ¨λœ μ½”λ“œ

(1) +ES6의 Promiseλ₯Ό μ΄μš©ν•œ 방식

new Promise((resolve) => {
	setTimeout(() => {
              let name = 'μ—μŠ€ν”„λ ˆμ†Œ';
              console.log(name);
              resoleve(name);
    }, 500)
})
  .then((prevName) => {
  	new Promise((resolve) => {
              setTimeout(() => {
                    let name = prevName + ', 아메리카노';
                    console.log(name);
                    resoleve(name);
              }, 500)
	})
  })
  .then((prevName) => {
      new Promise((resolve) => {
                setTimeout(() => {
                      let name = prevName + ', μΉ΄νŽ˜λΌλ–Ό';
                      console.log(name);
                      resoleve(name);
     			}, 500)
      })
   })
  • promise의 인자둜 λ„˜κ²¨μ£ΌλŠ” 콜백 ν•¨μˆ˜λŠ” ν˜ΈμΆœν•  λ•Œ λ°”λ‘œ μ‹€ν–‰λ˜μ§€λ§Œ
  • κ·Έ 내뢀에 resolve λ˜λŠ” reject ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” ꡬ문이 μžˆμ„ 경우,
    • λ‘˜ 쀑 ν•˜λ‚˜κ°€ μ‹€ν–‰λ˜κΈ° μ „κΉŒμ§€λŠ” .then λ˜λŠ” 였λ₯˜ ꡬ문 catch둜 λ„˜μ–΄κ°€μ§€ μ•ŠλŠ”λ‹€
    • 비동기 μž‘μ—…μ΄ μ™„λ£Œλ  λ•Œ resolve λ˜λŠ” rejectλ₯Ό ν˜ΈμΆœν•˜λŠ” λ°©λ²•μœΌλ‘œ 비동기 μž‘μ—…μ˜ 동기적 ν‘œν˜„μ΄ κ°€λŠ₯ν•˜λ‹€

(2) Promise + Async/await

const addCoffee = (name) => {
	return new Promise((resolve) => {
    	setTimeout((
        	resolve(name);
        ), 500);
    });
};

const coffeeMaker = async () => {
	let coffeeList = '';
    const _addCoffee = async (name) => {
    	coffeeList += (coffeeList ? ',' : '') + 
        await addCoffee(name);
    }
    await _addCoffee('μ—μŠ€ν”„λ ˆμ†Œ');
    console.log(coffeeList);
    await _addCoffee('아메리카노');
    console.log(coffeeList);
    await _addCoffee('μΉ΄νŽ˜λΌλ–Ό');
    console.log(coffeeList);
    await _addCoffee('카페λͺ¨μΉ΄');
    console.log(coffeeList);
};

coffeeMaker();

ES2017μ—μ„œ λ“±μž₯ν•œ Async/awaitλŠ” 가독성이 λ›°μ–΄λ‚˜κ³ , μž‘μ„±λ²•μ΄ κ°„λ‹¨ν•˜λ‹€λŠ” μž₯점이 μžˆλ‹€.

  • 비동기 μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³ μž ν•˜λŠ” ν•¨μˆ˜ μ•žμ— async ν‚€μ›Œλ“œλ₯Ό λΆ™ν˜€μ£Όκ³ ,
  • ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ‹€μ§ˆμ μΈ 비동기 μž‘μ—…μ΄ ν•„μš”ν•œ μœ„μΉ˜λ§ˆλ‹€ await ν‚€μ›Œλ“œλ₯Ό λΆ™ν˜€μ£Όλ©΄
  • λ’€μ˜ λ‚΄μš©μ„ Promise둜 μžλ™ μ „ν™˜ν•˜κ³ , ν•΄λ‹Ή λ‚΄μš©μ΄ resolve된 이후에 λ‹€μŒμœΌλ‘œ μ§„ν–‰ν•œλ‹€.

즉, Promise의 .thenκ³Ό ν‘μ‚¬ν•œ 효과λ₯Ό 얻을 수 μžˆλ‹€.


✨ tl;dr

  • 콜백 ν•¨μˆ˜λŠ” λ‹€λ₯Έ μ½”λ“œμ— 인자λ₯Ό λ„˜κ²¨μ€ŒμœΌλ‘œμ¨ κ·Έ μ œμ–΄κΆŒλ„ ν•¨κ»˜ μœ„μž„ν•œ ν•¨μˆ˜μ΄λ‹€.
  • μ œμ–΄κΆŒμ„ λ„˜κ²¨λ°›μ€ μ½”λ“œλŠ”
    1) 콜백 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” μ‹œμ μ„ 슀슀둜 νŒλ‹¨ν•΄μ„œ μ‹€ν–‰
    2) 콜백 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ 인자둜 λ„˜κ²¨μ€„ κ°’λ“€ 및 κ·Έ μˆœμ„œκ°€ μ •ν•΄μ Έ μžˆλ‹€. 이 μˆœμ„œλ₯Ό λ”°λ₯΄μ§€ μ•Šκ³  μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ μ—‰λš±ν•œ κ²°κ³Όλ₯Ό μ–»κ²Œ λ˜λ‹ˆ 주의!
    3) 콜백 ν•¨μˆ˜μ˜ thisκ°€ 무엇을 바라보도둝 할지가 μ •ν•΄μ Έ μžˆλŠ” κ²½μš°λ„ μžˆλŠ”λ°, μ •ν•˜μ§€ μ•Šμ€ κ²½μš°μ—λŠ” 전역객체(window)λ₯Ό 바라본닀.
    • μ‚¬μš©μž μž„μ˜λ‘œ thisλ₯Ό λ°”κΎΈκ³  싢을 경우 bind λ©”μ„œλ“œλ₯Ό ν™œμš©ν•˜λ©΄ λœλ‹€.
  • μ–΄λ–€ ν•¨μˆ˜μ— 인자둜 λ² μ„œλ“œλ₯Ό μ „λ‹¬ν•˜λ”λΌλ„ κ²°κ΅­ ν•¨μˆ˜λ‘œμ„œ μ‹€ν–‰λœλ‹€
  • 비동기 μ œμ–΄λ₯Ό μœ„ν•œ 콜백 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  λ•Œμ—” Promise + Async/await 을 μ΄μš©ν•˜λ©΄ λœλ‹€
profile
πŸš€ λ‚΄κ°€ 보렀고 μ“°λŠ” κΈ°μˆ λΈ”λ‘œκ·Έ

0개의 λŒ“κΈ€