최상위 수준에서 async / await를 어떻게 사용할 수 있습니까?
나는 async / await를 방문한 후에 직접 테스트하기로 결정했습니다. 그러나 이것이 작동하지 않는 이유에 대해 머리를 감쌀 수는 없습니다.
async function main() {
var value = await Promise.resolve('Hey there');
console.log('inside: ' + value);
return value;
}
var text = main();
console.log('outside: ' + text)
콘솔은 다음을 출력합니다 (노드 v8.6.0).
> 외부 : [객체 약속]
> 내부 : 안녕하세요
함수 내부의 로그 메시지가 나중에 실행되는 이유는 무엇입니까? 작업을 사용하여 동기 실행을 수행하기 위해 async / await가 생성 된 이유라고 생각했습니다.
.then()
after 를 사용하지 않고 함수 내부에서 반환 된 값을 사용할 수있는 방법이 main()
있습니까?
왜 작동하지 않는지에 대해 머리를 감쌀 수 없습니다.
main
약속을 반환 하기 때문에 ; 모든 async
기능이 수행됩니다.
최상위 수준에서 다음 중 하나를 수행해야합니다.
async
하지 않는 거부 최상위 함수를 사용 합니다 ( "처리되지 않은 거부"오류를 원하지 않는 경우).사용
then
및catch
, 또는(출시 예정!) 를 사용하여 최고 수준
await
의에서 3 단계에 도달 한 한 제안 과정 의 최상위 사용할 수await
있습니다.
# 1- async
절대 거부하지 않는 최상위 기능
(async () => {
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
})();
주목하십시오 catch
; 은 당신 있어야합니다 에 가고 아무것도 때문에, 약속의 거부 / 비동기 예외를 처리; 자율 발신자가 없습니다. 원하는 경우 catch
함수 를 통해 호출 한 결과에 대해 수행 할 수 있습니다 ( try
/ catch
구문 대신 ) :
(async () => {
var text = await main();
console.log(text);
})().catch(e => {
// Deal with the fact the chain failed
});
... 조금 더 간결합니다 (그 이유 때문에 좋아합니다).
"처리하지 않고 거부하지 않고"오류 만 허용하십시오.
# 2- then
그리고catch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
catch
발생하는 경우 처리기가 호출되거나 오류가 발생 then
합니다. ( catch
핸들러가 오류를 처리하도록 등록되지 않았으므로 오류가 발생하지 않도록 하십시오 .)
또는 두 인수 모두 then
:
main().then(
text => {
console.log(text);
},
err => {
// Deal with the fact the chain failed
}
);
다시 우리가 거부 처리기를 등록하고 있음을 주목하십시오. 그러나이 형식에서는 then
어떤 오류도 오류를 발생하고있는 것이 처리하기 위해 등록 된 것이 없는지 확인하십시오 .
# 3 await
모듈의 최상위
await
모듈이 아닌 스크립트의 최상위 수준 에서는 사용할 수 없지만 최상위 수준 await
제안 ( Stage 3 )에서는 모듈의 최상위 수준에서 사용할 수 있습니다. async
처리되지 않은 거부 오류가 발생하기 때문에 최상위 코드가 거부 (오류 발생)하는 것을 원하지 않는다는 점에서 최상위 함수 래퍼 (위의 # 1) 를 사용하는 것과 유사합니다 . 따라서 # 1과 같이 문제가 발생할 때 처리되지 않은 거부를 원하지 않는 한 오류 처리기에 코드를 래핑하고 싶을 것입니다.
// In a module, once the top-level `await` proposal lands
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
이 문제에 대한 실제 해결책은 다르게 접근하는 것입니다.
아마도 당신의 목표는 일반적으로 응용 프로그램의 최상위 수준에서 발생하는 일종의 초기화입니다.
해결책은 애플리케이션의 최상위 레벨에 단 하나의 JavaScript 문만 있도록하는 것입니다. 애플리케이션 상단에 명령문이 하나만있는 경우 다른 모든 지점에서 자유롭게 async / await를 사용할 수 있습니다 (물론 일반 구문 규칙에 따름)
다시 말해, 전체 최상위 수준을 함수에 래핑하여 더 이상 최상위 수준이 아니며 응용 프로그램의 최상위 수준에서 async / await를 실행하는 방법에 대한 질문을 해결합니다.
애플리케이션의 최상위 수준은 다음과 같습니다.
import {application} from './server'
application();
최상위 수준await
이 3 단계로 이동했기 때문에 귀하의 질문에 대한 답변 은 최상위 수준에서 어떻게 async / await를 사용할 수 있습니까? 에 await
대한 호출을 추가 하는 것입니다 main()
.
async function main() {
var value = await Promise.resolve('Hey there');
console.log('inside: ' + value);
return value;
}
var text = await main();
console.log('outside: ' + text)
아니면 그냥 :
const text = await Promise.resolve('Hey there');
console.log('outside: ' + text)
Webpack@v5.0.0-alpha.15 에서만 여전히 사용할 수 있습니다 .
현재 답변에 대한 추가 정보를 제공하려면 :
node.js
파일 의 내용 은 현재 문자열과 같은 방식으로 연결되어 함수 본문을 형성합니다.
예를 들어 파일이있는 경우 test.js
:
// Amazing test file!
console.log('Test!');
그런 다음 node.js
다음과 같은 함수를 비밀리에 연결합니다.
function(require, __dirname, ... a bunch more top-level properties) {
// Amazing test file!
console.log('test!');
}
중요한 점은 결과 함수가 비동기 함수가 아니라는 것입니다. 따라서 용어를 await
직접 사용할 수 없습니다 !
그러나이 파일에서 promise를 사용해야한다고 가정하면 두 가지 가능한 방법이 있습니다.
- 함수 내부에서
await
직접 사용하지 마십시오. - 사용하지 마십시오
await
옵션 1을 사용하려면 새 범위를 만들어야합니다 (이 범위는 async
우리가 제어 할 수 있으므로이 될 수 있습니다 ).
// Amazing test file!
// Create a new async function (a new scope) and immediately call it!
(async () => {
await new Promise(...);
console.log('Test!');
})();
옵션 2에서는 객체 지향 약속 API를 사용해야합니다 (약속 작업을 수행하는 덜 예쁘지 만 동등하게 작동하는 패러다임).
// Amazing test file!
// Create some sort of promise...
let myPromise = new Promise(...);
// Now use the object-oriented API
myPromise.then(() => console.log('Test!'));
개인적으로 작동 가능하다면 node.js가 기본적으로 코드를 async
함수에 연결하기를 바랍니다 . 그러면이 두통이 사라질 것입니다.
main()
비동기 적으로 실행 되기 때문에 약속을 반환합니다. then()
메서드 에서 결과를 얻어야합니다 . 그리고 then()
약속을 반환 하기 때문에 process.exit()
프로그램을 끝내 려면 호출 해야합니다.
main()
.then(
(text) => { console.log('outside: ' + text) },
(err) => { console.log(err) }
)
.then(() => { process.exit() } )
참고 URL : https://stackoverflow.com/questions/46515764/how-can-i-use-async-await-at-the-top-level
'IT' 카테고리의 다른 글
PyCharm을 사용하여 IntelliJ IDEA에서 Python 인터프리터를 구성해야할까요? (0) | 2020.08.19 |
---|---|
코드 우선 : 독립 연결 vs. 외래 키 연결? (0) | 2020.08.19 |
운영 변환 라이브러리? (0) | 2020.08.19 |
isset () 및 empty ()-사용할 사항 (0) | 2020.08.19 |
'is'대 null 검사로 시도 캐스트 (0) | 2020.08.19 |