(js) 약속 정리

약속 정리( 상태, 생산자, 소비자(그럼 드디어 잡는다), 약속 체이닝, 오류 처리 )

약속이란 무엇입니까?

1. Promise는 비동기 작업을 위한 Javascript 개체입니다.

2. Promise는 State라는 status 값을 가지며 Promise 생성 부분과 사용 부분으로 나눌 수 있습니다.

3. 비동기 처리 동작은 기본적으로 콜백과 동일하나 단점(콜백 지옥)이 추가된다.

1) 조건

상태: 보류 중 -> 만족 또는 거부됨(대기 중 -> 만족 또는 거부됨)

보류 상태 = 값을 아직 알 수 없는 경우(데이터가 제대로 매핑되지 않은 경우 등)

이행 상태 = 반환 값이 할당된 시기를 나타냅니다.

거부됨 상태 = 다음과 같은 오류가 발생한 경우를 나타냅니다. B. 네트워크 오류가 발생합니다.

2) 생산자, 소비자 (생산자 대 사용자) 아래를 참조하십시오.


하나. 제조업체(제조사)

새로운 약속이 만들어지면 집행자(아티스트) 자동으로 실행

성공으로 달리는 집행자 실패할 때 실행되는 Resolve 및 Reject가 있습니다.

해상도가 실행 중일 때

const promise = new Promise((resolve, reject) => {
  // 네트워크를 통한 데이터 수신, 파일 읽기와 같은 시간이 걸리는 일을 수행한다.
  console.log('doing something...');
  setTimeout(() => {
  	resolve('success'); // 성공 시 호출
    }, 2000);
});

promise.then((value) => {
  console.log(value);
})

2초 후 Promise가 성공하면 호출되는 resolve가 실행됩니다.

출력값

success

거부가 실행될 때

const promise = new Promise((resolve, reject) => {
  // 네트워크를 통한 데이터 수신, 파일 읽기와 같은 시간이 걸리는 일을 수행한다.
  console.log('doing something...');
  setTimeout(() => {
    reject(new Error('no network')); // 실패 시 호출
    }, 2000);
});

promise.then((value) => {
  console.log(value);
})

2초 후에 Promise가 실패하면 호출되는 Reject가 실행됩니다.

출력값

– 오류 발생 시 예외처리를 하지 않기 때문에 오류창이 출력됩니다.


2. 컨슈머(user): 그럼, 드디어 잡아

promise
  .then((value) => {
  console.log(value);
  })
  .catch(error => {
    console.log(error);
  })
  .finally(() => { console.log('finally'); });

그 다음에()Promise는 정상적으로 실행되며 resolve라는 콜백 함수가 전달한 값이 value의 매개변수로 전달됩니다.
잡다()실패하고 “resolve” 대신 “reject”가 호출되는 경우 사용됩니다. (오류 처리 방법)
마지막으로()성공 여부와 상관없이 실행되는 함수입니다.

출력값

// 성공시
"success"
"finally"

// 실패시
no networkError
"finally"


3. 약속 연결

const fetchNumber = new Promise(resolve, reject) => {
    setTimeout(() => resolve(1), 1000);
});
 
 
 fetchNumber
.then(num => num * 2)
.then(num => num * 3)
.then(num => {
  return new Promise(resolve, reject) => {
    setTimeout(() => resolve(num - 1), 1000);
    });
})
.then(num => console.log(num));

위의 코드는 2초 후에 5를 반환합니다.
then()은 값이나 약속을 직접 전달할 수 있습니다.


4. 오류 처리

const getA = () => 
  new Promise((resolve, reject) => 
    {setTimeout(() => resolve(`A`), 1000)
  });

const getB = A => 
  new Promise((resolve, reject) => 
    {setTimeout(() => resolve(`${A} => B`), 1000)
  });

const getC = B => 
  new Promise((resolve, reject) => 
    {setTimeout(() => resolve(`${B} => C`), 1000)
  });

위와 같은 코드가 있습니다.

다음 두 코드는 동일하게 작동합니다.

getA()
  .then(A => getB(A))
  .then(B => getC(B))
  .then(ABC => console.log(ABC));

getA() //
  .then(getB)
  .then(getC)
  .then(console.log);

하나의 값만 전달되고 수신되는 경우 위의 코드와 같이 생략할 수 있습니다.

// 두 번째 getA()에 주석이 없으면 pretty에서 한 줄로 변환됩니다.

아래는 오류 처리 방법입니다.

// getB에서 Error가 발생되었을 때
const getB = A => 
  new Promise((resolve, reject) => 
    {setTimeout(() => reject(new Error(`error! ${A} => B`)), 1000)
  });

  
getA() //
  .then(getB)
  .catch(error => {
  	return 'b';
  })
  .then(getC)
  .then(console.log)
  .catch(console.log);

위의 코드에서와 같이 then() 중간에 .catch()를 사용하여 자세한 오류 처리가 가능합니다.


Promise 사용시 주의사항

1. Promise는 선언 시점에 값을 요청하고 받기 때문에 사용하지 않는 값을 가져올 수 있습니다.

2. Cunsumer의 요구 사항에 따라 netNetworkConnect를 가져와야 합니다.

3. 아무도 묻지 않고 의사소통을 계속하도록 허용하면 자원을 낭비할 수 있습니다.