> 웹 프론트엔드 > JS 튜토리얼 > 비동기 JavaScript 함수가 기본 값을 반환할 때에도 항상 Promise를 반환하는 이유는 무엇입니까?

비동기 JavaScript 함수가 기본 값을 반환할 때에도 항상 Promise를 반환하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-18 15:05:13
원래의
580명이 탐색했습니다.

Why Do Async JavaScript Functions Always Return Promises, Even When Returning Primitive Values?

Promise를 반환하는 비동기 함수: 자세한 설명

JavaScript에서는 비동기 함수와 Promise 간의 상호 작용을 이해하는 것이 중요합니다. JavaScript ES2017에 도입된 비동기 함수는 콜백 없이도 비동기 작업을 허용합니다. 비동기 작업의 최종 결과를 나타내는 promise를 반환합니다.

다음 비동기 함수를 고려하세요.

async function latestTime() {
  const bl = await web3.eth.getBlock('latest');
  console.log(bl.timestamp); // Returns a primitive
  console.log(typeof bl.timestamp.then == 'function'); // Returns false - not a promise
  return bl.timestamp;
}
로그인 후 복사

lateTime 함수가 다른 비동기 함수에서 사용되지 않으면 혼란이 발생합니다. 비동기 컨텍스트 외부의 변수에 할당됩니다.

const time = latestTime(); // Promise { <pending> }
로그인 후 복사

결과적으로 time 변수는 비동기 함수가 반환하는 기본 값입니다. 이는 비동기 함수가 본문 내에서 기본 값을 반환하더라도 항상 Promise를 반환하기 때문에 발생합니다.

이 상황을 적절하게 처리하려면 두 가지 옵션이 있습니다:

1. Promise를 직접 사용:

이벤트 핸들러나 모듈 최상위 수준과 같은 비동기식 컨텍스트에서는 Promise를 직접 처리해야 합니다. then() 메소드를 사용할 수 있습니다:

latestTime()
  .then(time => {
    console.log(time);
  })
  .catch(error => {
    // Handle/report error
  });
로그인 후 복사

2. 모듈의 최상위 Await:

최신 JavaScript 환경은 모듈의 최상위 Await를 지원하므로 다음을 작성할 수 있습니다.

const time = await latestTime();
로그인 후 복사

Under the Hood:

JavaScript 엔진이 비동기 함수를 처리하는 방법을 이해하려면 재작성을 명시적 약속으로 간주하세요. 콜백:

function latestTime() {
  return new Promise((resolve, reject) => {
    web3.eth.getBlock('latest')
      .then(bl => {
        console.log(bl.timestamp);
        console.log(typeof bl.timestamp.then == 'function');
        resolve(bl.timestamp);
      })
      .catch(reject);
  });
}
로그인 후 복사

이 명시적인 Promise 구문은 몇 가지 중요한 사항을 강조합니다.

  • Promise 실행자 함수(새 Promise에 전달됨)는 동기식으로 실행되므로 web3.eth.getBlock이 여기에 해당됩니다. 즉시 호출됩니다.
  • Promise 실행기 또는 해당 콜백 내에서 발생하는 오류가 포착되어 Promise로 전파됩니다. 거절당했습니다.

위 내용은 비동기 JavaScript 함수가 기본 값을 반환할 때에도 항상 Promise를 반환하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿