매일 한줄 코딩

13. javascript Promise 본문

develop/javascript

13. javascript Promise

ShipJH 2022. 9. 11. 22:03
4. Promise

4. Promise

1. 콜백지옥

비동기방식의 콜백이 깊어지는 것 ⇒ 콜백지옥

자바스크립트의 비동기를 돕는것 ⇒ Promise

아래처럼 콜백 지옥에 빠질 수 있다.

//콜백에 콜백에 콜백...
taskA(4, 5, (a_res) => {
  console.log("A result ", a_res);
  taskB(a_res, (b_res) => {
    console.log("B result ", b_res);
    taskC(b_res, (c_res) => {
      console.log("C result ", c_res);
    });
  });
});

//...


2. 비동기 작업이 가지는 상태 3가지

Pending (대기 상태) : 비동기 작업이 진행중이거나, 작업을 할 수없는 문제일 경우

Fulfilled (성공) : 비동기 작업이 정상적으로 수행한 상태

Rejected (실패) : 비동기 작업이 실패한 상태

Pending (대기 상태)Fulfilled (성공) : resolve (해결) 이라 부른다.

Pending (대기 상태)Rejected (실패) : reject (거부) 라 부른다.

resolve (해결)

function isPositive(number, resolve, reject) {
  setTimeout(() => {
    if (typeof number === "number") {
      // 성공 resolve
      resolve(number >= 0 ? "양수" : "음수");
    } else {
      // 실패 reject
      reject("숫자형 타입이 아닙니다.");
    }
  }, 2000);
}

isPositive(
  10,
  (res) => {
    console.log("성공적 수행:", res);
  },
  (err) => {
    console.log("실패 :", err);
  }
);

3. Promise 사용

function isPositiveP(number) {

// Promise 선언하면 파라미터 순서에따라 1번째는 resolve, 2번째는 reject 이다.
  const excutor = (resolve, reject) => { 
    setTimeout(() => {
      if (typeof number === "number") {
        // 성공 resolve
        console.log(number);
        resolve(number >= 0 ? "양수" : "음수");
      } else {
        // 실패 reject
        reject("숫자형 타입이 아닙니다.");
      }
    }, 1000);
  };

  const asyncTask = new Promise(excutor);
  return asyncTask;
}

const res = isPositiveP(999);

res
  .then((res) => {
    console.log("작업성공:", res);
  })
  .catch((err) => {
    console.log("작업실패:", err);
  });

4. 기존 코드 콜백지옥에서 Promise 이용하여 벗어나기

기존코드(클릭) 🤏

function taskA(a, b) {
  return new Promise((success, fail) => {
    setTimeout(() => {
      const response = a + b;
      success(response);
    }, 3000);
  });
}

function taskB(a) {
  return new Promise((success, fail) => {
    setTimeout(() => {
      const response = a * 2;
      success(response);
    }, 1000);
  });
}

function taskC(a) {
  return new Promise((success, fail) => {
    setTimeout(() => {
      const response = a * -1;
      success(response);
    }, 2000);
  });
}

taskA(3, 4).then((a_res) => {
  console.log("A result", a_res);
  taskB(a_res).then((b_res) => {
    console.log("B result", b_res);
    taskC(b_res).then((c_res) => {
      console.log("C result", c_res);
    });
  });
});

console.log("끝");

바꿔보니 거의 변한게 없다..

이렇게 사용하는것이 아니라서 그렇다.

제대로된 사용법

function taskA(a, b) {
  return new Promise((success, fail) => {
    setTimeout(() => {
      const response = a + b;
      success(response);
    }, 3000);
  });
}

function taskB(a) {
  return new Promise((success, fail) => {
    setTimeout(() => {
      const response = a * 2;
      success(response);
    }, 1000);
  });
}

function taskC(a) {
  return new Promise((success, fail) => {
    setTimeout(() => {
      const response = a * -1;
      success(response);
    }, 2000);
  });
}

taskA(3, 4)
  .then((a_res) => {
    console.log("A result", a_res);
    return taskB(a_res); // B promise 반환
  })
  .then((b_res) => {
    // promise 반환했기때문에 또 .then 가능.
    console.log("B result", b_res);
    return taskC(b_res); // C promise 반환
  })
  .then((c_res) => {
    // promise 반환했기때문에 또 .then 가능.
    console.log("C result", c_res);
  });

console.log("끝");

Comments