>웹 프론트엔드 >JS 튜토리얼 >JavaScript의 비동기 함수는 어떻게 항상 Promise를 반환합니까?

JavaScript의 비동기 함수는 어떻게 항상 Promise를 반환합니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-20 11:50:09410검색

How Do Async Functions in JavaScript Always Return a Promise?

비동기 함수와 약속의 관계 이해

JavaScript에서 비동기 함수는 동기식으로 나타나는 코드를 작성할 수 있도록 하여 비동기 프로그래밍을 단순화합니다. 비동기적으로 실행됩니다. 그러나 비동기 함수가 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;
}

최신 시간()을 호출하면 web3.eth.getBlock에서 타임스탬프의 기본 값을 받을 것으로 예상할 수 있습니다. 그러나 대신 다음과 같이 보류 중인 Promise를 받게 됩니다.

const time = latestTime(); // Promise { <pending> }

Promise가 반환되는 이유

비동기 함수는 항상 Promise를 반환합니다. 이 Promise는 함수가 비동기 작업을 완료하고 최종 값을 제공하거나 오류와 함께 거부할 때 확정됩니다. 최신 시간()의 경우, 약속은 타임스탬프 프리미티브로 처리됩니다.

Promise 처리 방법

다른 비동기 함수 외에 그런 다음 해결된 값에 액세스하거나 오류를 처리하기 위한 약속에 대한 메서드:

latestTime()
.then(time => {
    console.log(time);
})
.catch(error => {
    // Handle/report error
});

최상위 수준 wait

최신 환경은 모듈에서 최상위 수준 wait를 지원하므로 다음과 같은 코드를 작성할 수 있습니다.

const time = await latestTime();

이 구문은 모듈 수준에서 Promise 작업을 단순화합니다. 그러나 모듈에서 처리되지 않은 Promise 거부로 인해 모듈 로드에 실패할 수 있다는 점을 기억하세요.

Promise를 사용한 비동기 함수 이해

비동기 함수가 함께 작동하는 방식을 더 잘 이해하려면 Promise를 사용하면 JavaScript 엔진이 비동기 함수를 Promise 실행기로 컴파일하는 방법을 고려하는 것이 도움이 됩니다. 함수:

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 실행자 함수로 표시됩니다.
  • 비동기 작업은 다음과 같이 시작됩니다. web3.eth.getBlock은 동기식으로 호출됩니다.
  • Promise 콜백은 해결 또는 거부에 사용됩니다.

결과적으로 비동기 함수는 호출 코드에 대한 약속을 효과적으로 반환합니다.

위 내용은 JavaScript의 비동기 함수는 어떻게 항상 Promise를 반환합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.