programing

비동기 함수 외부에서 대기 사용

bestprogram 2023. 8. 5. 10:44

비동기 함수 외부에서 대기 사용

저는 두 개의 비동기 함수를 연결하려고 했습니다. 첫 번째 함수는 두 번째 함수를 실행하거나 모듈을 종료하는 조건부 반환 매개 변수를 가지고 있었기 때문입니다.하지만 스펙에서 찾을 수 없는 이상한 행동을 발견했습니다.

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