왜 이것이 효과가 없는지 머리를 감쌀 수 없습니다.
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
어떤 콜백도 오류를 발생시키지 않으며 오류를 처리하기 위해 등록 된 것이 없습니다.
await
모듈에서 3 위
await
비 모듈 스크립트의 최상위 수준 에서는 사용할 수 없지만 최상위 await
제안 ( 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
}
이 작업을 수행하면 모듈에서 가져 오는 모든 모듈이 약속 await
이 확정 될 때까지 기다립니다 . 최상위 레벨을 사용하는 모듈 await
이 평가되면 기본적으로 모듈 로더에 약속을 반환합니다 ( async
함수 처럼 ).이 약속은 모듈에 의존하는 모든 모듈의 본문을 평가하기 전에 해당 약속이 완료 될 때까지 기다립니다.
await
약속then
구문의 설탕 일뿐입니다.