비동기 함수 외부에서 대기 사용
저는 두 개의 비동기 함수를 연결하려고 했습니다. 첫 번째 함수는 두 번째 함수를 실행하거나 모듈을 종료하는 조건부 반환 매개 변수를 가지고 있었기 때문입니다.하지만 스펙에서 찾을 수 없는 이상한 행동을 발견했습니다.
async function isInLobby() {
//promise.all([chained methods here])
let exit = false;
if (someCondition) exit = true;
}
이것은 제 코드의 일부입니다(여기서 전체 범위를 볼 수 있습니다). 플레이어가 이미 로비에 있는지 확인하기만 하면 됩니다. 하지만 그것은 관련이 없습니다.
다음은 이 비동기 기능입니다.
async function countPlayer() {
const keyLength = await scardAsync(game);
return keyLength;
}
다음과 같은 경우 이 기능을 실행할 필요가 없습니다.exit === true
.
하려고 했습니다.
const inLobby = await isInLobby();
결과가 나올 때까지 기다렸으면 하는 바람에inLobby
조건부로 달리다countPlayer
하지만 구체적인 내용이 없는 타입 오류를 받았습니다.
왜 안 돼요?await
하나의async
기능의 범위를 벗어난 기능?설탕 약속인 거 알아요, 그래서 그것은 사슬로 묶여 있어야 합니다.then
하지만 왜 그것이.countPlayer
다른 약속을 기다릴 수는 있지만, 밖에서는 그럴 수 없습니다.await
isInLobby
?
물론 항상 다음과 같은 것이 있습니다.
(async () => {
await ...
// all of the script....
})();
// nothing else
이것은 당신이 wait를 사용할 수 있는 비동기식의 빠른 기능을 만듭니다.그것은 당신이 훌륭한 비동기 기능을 만들 필요를 덜어줍니다! //creditSilve2611
최상위await
지원되지 않습니다.이 Github 이슈와 같이 표준 위원회에서 왜 이것인지에 대한 몇 가지 논의가 있습니다.
Github에는 최고 수준이 기다리는 것이 왜 나쁜 생각인지에 대한 생각이 있습니다.특히 그는 만약 당신이 다음과 같은 코드를 가지고 있다면 제안합니다.
// data.js
const data = await fetch( '/data.json' );
export default data;
이제 가져오는 모든 파일data.js
가져오기가 완료될 때까지 실행되지 않으므로 모든 모듈 로드가 차단됩니다.우리는 동기적이고 예측 가능하게 실행되는 최상위 자바스크립트에 익숙하기 때문에 앱 모듈 순서에 대해 추론하는 것이 매우 어렵습니다.이것이 허용되면 함수가 정의되는 시기를 알기가 어려워집니다.
저는 당신의 모듈을 단순히 로딩하는 것만으로 부작용이 발생하는 것은 나쁜 관행이라고 생각합니다.즉, 모듈을 사용하는 모든 소비자는 모듈을 필요로 하는 것만으로 부작용을 얻을 수 있습니다.이로 인해 모듈을 사용할 수 있는 위치가 크게 제한됩니다.최상위 레벨await
로드 시 API를 읽거나 서비스를 호출하는 것을 의미합니다.대신 소비자가 원하는 속도로 사용할 수 있는 비동기 기능만 내보내야 합니다.
Node.js 기준으로 최상위 대기는 다음 플래그로 지원됩니다.
--experimental-top-level-await
Node.js / 기준으로 플래그가 필요하지 않습니다.
상세정보 : https://v8.dev/features/top-level-wait.
당신은 3.8타입 스크립트 이후로 최상위 대기를 할 수 있습니다.
https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#-://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#-top-level-await
게시물에서:
이것은 이전에 자바스크립트(비슷한 기능을 가진 대부분의 다른 언어와 함께)에서 wait가 비동기 함수의 본문 내에서만 허용되었기 때문입니다.그러나 최상위 대기 상태에서는 모듈의 최상위 대기 상태를 사용할 수 있습니다.
const response = await fetch("...");
const greeting = await response.text();
console.log(greeting);
// Make sure we're a module
export {};
최상위 대기는 모듈의 최상위 수준에서만 작동하며 파일은 TypeScript가 가져오기 또는 내보내기를 찾을 때만 모듈로 간주됩니다.기본적인 경우에는 이를 확인하기 위해 내보내기 {}을(를) 보일러 플레이트로 작성해야 할 수 있습니다.
이 시점에서 예상되는 모든 환경에서 최상위 대기가 작동하지 않을 수 있습니다.현재 target 컴파일러 옵션이 es2017 이상이고 module이 esnext 또는 system일 때만 top level wait를 사용할 수 있습니다.여러 환경 및 번들러 내의 지원은 제한적이거나 실험적인 지원이 필요할 수 있습니다.
언급URL : https://stackoverflow.com/questions/39679505/using-await-outside-of-an-async-function
'programing' 카테고리의 다른 글
결근 날짜와 함께 직원의 이름을 표시하는 방법은 무엇입니까? (0) | 2023.08.05 |
---|---|
오류 없이 "conda install --yes --file requirements.txt"를 사용하여 사용 가능한 패키지만 설치합니다. (0) | 2023.08.05 |
Angular2: 정의되지 않은 속성 'name'을(를) 읽을 수 없습니다. (0) | 2023.08.05 |
mySQL의 데이터 유형 "Time"이 Access에서 "Datetime"으로 바뀝니다. (0) | 2023.08.05 |
mysql에서 메시징 대기열 테이블을 구현하는 가장 좋은 방법은 무엇입니까? (0) | 2023.08.05 |