스택큐힙리스트

어떻게 상위 레벨에서 async/await를 사용할 수 있을까요? 본문

카테고리 없음

어떻게 상위 레벨에서 async/await를 사용할 수 있을까요?

스택큐힙리스트 2024. 1. 5. 11:37
반응형

나는 async/await을 공부하고 여러 기사를 살펴본 후에 직접 테스트하기로 결정했습니다. 그러나 이 작업이 동작하지 않는 이유에 대해 이해하기 어렵습니다:


async function main() {  
var value = await Promise.resolve('안녕하세요');
console.log('내부: ' + value);
return value;
}
var text = main();
console.log('외부: ' + text);

콘솔은 다음과 같이 출력됩니다 (node v8.6.0) :



> 외부: [object Promise]


> 내부: 안녕하세요



왜 함수 내부의 로그 메시지가 이후에 실행되는 건가요? async/await은 비동기 작업을 사용하여 동기적으로 실행하는 목적으로 만들어진 것으로 이해했습니다.


.then()main() 다음에 사용하지 않고 함수 내부에서 반환된 값을 사용할 수 있는 방법이 있을까요?

답변 1

(async () => {
const text = await main();
console.log(text);
})().catch(e => {
// 방금 전달된 데이터가 소실했을 때 처리
});
// `text`는 여기에서 사용할 수 없으며, 이 코드는 약속이 처리되기 전에 실행되며
// 그리고 위의 main 함수에서 await 다음의 코드가 실행된 후에 실행됩니다.

...이렇게 좀 더 간결하지만, 모델을 조금 섞은 것 같아요 (async/await와 명시적인 약속 콜백), 그러나 일반적으로 권하지는 않습니다.


또는, 물론 오류를 처리하지 않고 처리되지 않은 거부 오류를 허용할 수도 있어요.


#3 - thencatch


main()
.then(text => {
console.log(text);
})
.catch(err => {
// 방금 전달된 데이터가 소실했을 때 처리
});
// `text`는 여기에서 사용할 수 없으며, 이 코드는 약속이 처리되기 전에 실행되며
// 그리고 위의 핸들러가 실행됩니다.

catch 핸들러는 체인이나 then 핸들러에서 오류가 발생할 경우 호출됩니다. (그렇기 때문에 catch 핸들러에서 오류를 throw하지 않도록 주의해야 합니다. 그런데 아무런 처리기도 등록되어 있지 않기 때문에).


또는 then에 대한 양쪽 인자:


main().then(
text => {
console.log(text);
},
err => {
// 체인이 실패한 사실을 처리하세요
}
);
// `text`는 여기에서 사용할 수 없으며, 이 코드는 프로미스가 처리되기 전에 실행되고,
// 위의 핸들러가 실행됩니다.

다시 한 번 거부 핸들러를 등록하는 것을 주목하세요. 하지만 이 형태에서는 양쪽then 콜백이 오류를 throw하지 않도록 주의하세요. 왜냐하면 그런 오류를 처리할 등록된 핸들러가 없기 때문입니다.

답변 2

최근의 자바스크립트(ECMAScript) 업데이트에서 도입된 async/await는 비동기적인 작업을 처리하는 데 매우 효과적인 방법입니다. 비동기 작업은 네트워크 요청, 파일 시스템 액세스 또는 데이터베이스 쿼리와 같은 I/O 작업을 수행할 때 유용합니다. 이러한 작업은 대기 시간이 필요하거나 실제 작업 완료 시간이 예측할 수 없기 때문에 동기적인 방식으로 처리하기 어렵습니다. 이제 async/await를 사용하면 이러한 비동기 작업을 편리하게 처리할 수 있습니다. 이번 글에서는 이러한 async/await를 최상위 수준에서 사용하는 방법에 대해 알아보겠습니다.
우선, async 키워드는 비동기 함수를 선언하는 데 사용됩니다. 이 함수는 암묵적으로 Promise 객체를 반환하고, 내부에서 await 키워드를 사용하여 다른 비동기 작업의 완료를 기다릴 수 있습니다. 예를 들어, 다음은 비동기적으로 데이터를 불러오는 함수입니다:
```javascript
async function fetchData() {
// 비동기 작업을 수행하는 함수 (네트워크 요청, 데이터베이스 쿼리 등)
return await fetch('http://example.com/data');
}
```
위의 코드에서 불러온 데이터를 외부에서 사용하고 싶다면, 최상위 수준 (전역 범위)에서 async/await를 사용하는 것이 가능합니다. 예를 들어, 스크립트 실행 시 자체적으로 비동기 작업을 처리하도록 하려는 경우 async 함수를 정의하고, 이 함수를 즉시 호출하는 방식으로 구현할 수 있습니다:
```javascript
(async function() {
const data = await fetchData();
// 불러온 데이터를 사용하는 코드

// 여기에 SEO-conscious Korean essay를 작성하는 코드를 추가할 수 있습니다.
})();
```
위의 코드에서는 async 함수를 익명으로 작성한 후 즉시 호출하고 있습니다. 이렇게 하면 비동기적인 작업을 수행하면서, 그 결과를 data 변수에 할당하고 이를 다른 작업에 활용할 수 있습니다.
async/await를 사용하여 비동기 작업을 최상위 수준에서 처리하는 것은 SEO에 영향을 주는 웹 페이지를 구축하는 데 도움을 줄 수 있습니다. 예를 들어, 웹 페이지 로딩 시 데이터를 비동기적으로 요청하고, 데이터를 받아온 후에 페이지 내용을 업데이트한다면 검색 엔진은 페이지의 내용을 더 잘 인덱싱할 수 있을 것입니다. 따라서 async/await를 사용하면 웹 페이지의 성능을 향상시키고 사용자 경험을 개선할 수 있습니다.
이와 같이, async/await를 최상위 수준에서 사용하여 비동기 작업을 처리하는 방법을 알아보았습니다. 이를 통해 웹 애플리케이션 혹은 서버에서 비동기적인 작업을 효율적으로 다룰 수 있으며, 이를 활용하여 사용자 경험과 성능을 향상시킬 수 있습니다.

반응형
Comments