Shin-Yeonghwa / Core_JS

Core_JS
2 stars 0 forks source link

4.5 콜백 지옥과 비동기 제어 #15

Open eunzy38 opened 4 years ago

eunzy38 commented 4 years ago

study 완료 후 체크 부탁드립니다.

dongggook commented 4 years ago

5. 콜백 지옥과 비동기 제어

OHKuenYoung commented 4 years ago

콜백 지옥과 비동기 제어

콜백 지옥 콜백함수를 익명 함수로 전달하는 과정이 반복되어 코드의 열여쓰기 수준이 감당하기 힘들 정도로 깊어지는 현상

동기적인 코드 현재 실행 중인 코드가 완료된 후에야 다음 코드를 실행하는 방식

비동기적인 코드 현재 실행 중인 코드의 완료 여부와 무관하게 즉시 다음크로드로 넘어 가는 방식

비동기 작업의 동기적 표현

promise

var addCoffee = function (name) {
  return function (prevName) {
    return new Promise(function (resolve) {
      setTimeout(function (){
        var newName = prevName ? (preName + ',' + name) : name;
        console.log(newName);
        resolve(newName);
      }, 500);
    });
  };
};

addCoffee ('에스프레소')()
  .then(addCoffee('아메리카노'))
  .then(addCoffee('아메리카노2'))
  .then(addCoffee('아메리카노3'));

new 연산자와 함께 호출한 Promise의 인자로 넘겨주는 콜백 함수는 호출할 때 바로 실행되지만 그 내부에 resolve 또는 reject 함수를 호출하는 구문이 있을 경우 둘 중 하나가 실행되기 전까지 다음 (then) 또는 오류 구문으로 넘어가지 않는다. 따라서 비동기 작업이 완료될 때 resolve 또는 reject를 호출하는 방법으로 비동기 작업의 동기적 표현이 가능하다.

Generator

  var addCoffee = function(prevName, name) {
    setTimeout(function (){
      coffeeMaker.next(prevName ? prevName + ',' + name : name);
    }, 500);
  };

  var coffeeGenerator = function* () {
    var espresso = yield addCoffee ('', '에스프레소');
    console.log(espresso);

    var americano = yield addCoffee(espresso, '아메리카노');
    console.log(americano);
  }

  var coffeeMaker = coffeeGenerator();
  coffeeMaker.next();

'*' 이 Generator 함수이며 이를 실행하면 Iterator가 반환되는데, Iterator는 next라는 메서드를 갖고 있다. next 메서드를 호출하면 Generator 함수 내부에서 가장 먼저 등장하는 yield에서 함수 실행을 멈춘 후 이후 다시 next 메서드 호출하며 앞서 멈췄던 부분부터 실행.

Promise + Async/await 가독성이 뛰어나면서 작성법도 간단한 작성 법

 var addCoffee = function (name) {
    return new Promise(function (resolve) {
      setTimeout(function (){
        resolve(name);
      }, 500);
    });
  };

  var coffeeMaker = async function() {
    var coffeeList ='';
    var _addCoffee = async function(name) {
      coffeeList += (coffeeList ? ',':'') + await addCoffee(name);
    }
    await _addCoffee('에스프레소');
    console.log(coffeeList);

    await _addCoffee('에스프레소2');
    console.log(coffeeList);

  };

  coffeeMaker();

함수 앞에 async를 표기하고 함수 내부에서 실질적인 비동기 작업이 필요한 위치마다 await를 표기하는 것만으로 뒤의 내용을 promise로 자동 전환하고, 해당 내용이 resolve된 이후에야 다음으로 진행

Lee-Bom commented 4 years ago

5. 콜백 지옥과 비동기 제어

jeonEK commented 4 years ago

5. 콜백 지옥과 비동기 제어

비동기 작업을 동기적으로 보일 수 있도록 하는 장치

hyeonggyo commented 4 years ago

4-5 콜백 지옥과 비동기 제어

KimHyeSeon commented 4 years ago

콜백 지옥과 비동기 제어

콜백지옥

비동기적인 코드

ES6의 Promise를 이용한 방식

ES6의 Generator

ES2017의 async/await

eunzy38 commented 4 years ago

콜백 지옥과 비동기 제어

콜백 지옥

동기적 코드

비동기적 코드

[비동기 작업의 동기적 표현]

ES6의 Promise를 이용한 방식

ES6의 Generator를 이용한 방식

ES2017의 async/await 도입