minlog

1. Promise - 비동기 패턴 객체 사용

1.1. 1. 비동기 패턴

1.1.1. 1-1. 콜백함수

callback 함수는 a라는 로직 이후에 실행 되는 로직을 말한다.

  • 함수의 인수로 사용되는 함수를 콜백함수
  • 실행 순서 보장
<code />
function a(callback){ // 1. 함수 setTimeout(()=>{ console.log("a"); callback() // 2. 콜백함수의 실행 위치 },1000) } function b() { console.log("b") } a (function (){ // 3. 콜백함수 = a 함수의 인수로 사용되는 function 함수 b() });

 

1.1.2. 1-2. 콜백지옥 (연이은 콜백함수의 사용)

  • 순차적으로 콜백함수를 사용할때 > 이와 같은 모양이 나타나게 된다.
  • 다음 순서를 보장은 하지만 관리가 힘듬
  • 사용패턴이 불편
<code />
function a(callback){ setTimeout(()=>{ console.log("a"); callback() },1000) } function b(callback) { setTimeout(() => { console.log("b"); callback() }, 1000) } function c(callback) { //// a 로직과 동일한 콜백함수들 ... } function d(callback) { // a 로직과 동일한 콜백함수들 ... } // 순차적 적용 a(function(){ b(function(){ c(function () { d(function () { console.log('Done!') }) }) }) })

 

 

 

 

1.2. 2. Promise객체

콜백함수의 대채로 사용할 수 있는 실행순서를 보장하는 객체

1.2.1. 2-1. async · await 사용

ES8 버전에서 나온 신 기술이다.

  • Promise 객체 생성 : new Promise 함수 내부에서 객체를 생성하여 사용한다.
  • 매개변수 : Promise객체에 매개변수로 resolve 를 넘겨주어 콜백과 동일한 역할을 한다.
  • 실행위치 및 매개변수 전달 : resolve() 매개변수도 함께 넘겨줄수 있다.
  • 이후 실행되는 함수 : 함수 앞에 async 를 붙혀준다.
  • 먼저 사용되는 함수 선언 : await 사용, await a() a 함수 내부의 resolve 매개 변수가 실행될때까지 기다리고 다음 코드로 넘어간다.
<code />
function a(){ //약속의 객체 생성 return new Promise(function (resolve) { // resolve 콜백과 동일한 역할 setTimeout(function(){ console.log('A'); //resolve(); resolve('hello a'); // 특정 내용을 해당 위치에서 실행 보장 },1000); }); } function b() { console.log("b") } async function test(){ const txt = await a(); // resolve매개 변수가 실행될때까지 기다리고 다음 코드로 넘어간다. console.log(txt) b() } test();

 

1.2.2. 2-2. async · await 예외처리 - try · catch

  • Promise 객체의 매개변수 : resolve가 다음 실행될 콜백함수라면 reject 는 정상적으로 호출될 수 없을때 사용한다.
  • 함수 정상 호출이 불가능 할때 : reject()를 실행하면 resolve로직이 실행되지 않는다. 해당 함수의 내부 로직도 실행을 막으려면 return 이 필요하다.
  • 이후 실행되는 함수 : try , catch , finally 로직을 사용해 에러가 났을때 실행되어야할 로직을 추가할 수 있다.
<code />
function a(number){ return new Promise((resolve, reject) => { //reject 정상적으로 호출될 수 없을때 사용 if(number > 4){ reject() // resolve 로직 실행되지 않는다. return; // 이후 로직이 실행되지 않도록 } setTimeout(()=>{ console.log('a'); resolve(); },1000) }); } async function test(){ try{ await a(8); // javscript 에러 console.log("resolve") }catch(error){ // 에러 내용 console.log("error") }finally{ console.log("finally") } }test();

 

1.2.3. 2-3. 2017 (ES8) 이전 버전 대채 사용, Promise객체 메서드

  • 이후 로직 : then() 사용하여 채이닝 하여 순차적으로 처리 가능하다.
<code />
function a(){ return new Promise((resolve)=>{ setTimeout(()=>{ console.log('a'); resolve(); },1000) }); } function b() { return new Promise((resolve) => { setTimeout(() => { console.log('b'); resolve(); }, 1000) }); } function c() { .... } function test(){ a().then(() => { return b(); }).then(()=>{ return c(); }).then(()=>{ console.log("마지막"); }) }test();

 

1.2.4. 2-4. Promise객체 메서드 예외처리

  • 거부되었을때 : .catch(()=> ) 를 사용하여 로직 처리
  • 거부 여부와 상관없이 : .finally(()=> ) 를 사용하여 로직 처리
<java />
function a(number){ return new Promise((resolve, reject) => { //reject 정상적으로 호출될 수 없을때 사용 if(number > 4){ reject() // resolve 로직 실행되지 않는다. return; // 이후 로직이 실행되지 않도록 } setTimeout(()=>{ console.log('a'); resolve(); },1000) }); } function test(){ a(5) .then(()=>{ // 처리 후 실행 console.log('resolve') }) .catch(()=>{ // 거부 되었을때 console.log('reject') }).finally(()=>{ // 거부 여부와 상관없이 실행 console.log('finally') }) }test();

'FrontEnd > Javascript' 카테고리의 다른 글

TypeScript 사용하기  (1) 2023.11.14
[ Javscript ] 정규표현식 RegExp  (0) 2023.08.15
[ Javascript ] Storage 활용  (0) 2023.08.14
[ Javascript ] Lodash 기능 사용하기  (0) 2023.08.14
[ Javascript ] 가져오기 / 내보내기  (0) 2023.08.14
profile

minlog

@jimin-log

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!