NodeJs에서 async()⇒{…}가 없는 최상위 await()

Jan 06 2023
async-await 함수가 일반적으로 작동하는 방법은 다음과 같습니다. 이제 다른 시나리오에 대해 이야기해 보겠습니다. 다음은 await 호출을 asyncfunction 안에 포함하지 않은 NodeJs 프로젝트 내 index.js 파일의 또 다른 예입니다(사용 중인 노드 버전은 다음과 같습니다). 19.

async-await 함수가 일반적으로 작동하는 방식은 다음과 같습니다.

function myDummyBackendCall() {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve({
        name: "Shivang",
        id: "asmdhajkdhajdsh8qweuqoweuiqepoi-0q-0eueiuaisjdaKcjaisku",
      });
    });
  });
}

// Used an async wrapper function to make an await call
(async () => {
  let data = await myDummyBackendCall();
  console.log(data);
})();

이제 다른 시나리오에 대해 이야기해 보겠습니다.

await다음은 내 호출을 함수 안에 포함하지 않은 NodeJs 프로젝트 내 index.js 파일의 또 다른 예입니다 async(사용 중인 노드 버전은 19.3.0임).

function myDummyBackendCall() {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve({
        name: "Shivang",
        id: "asmdhajkdhajdsh8qweuqoweuiqepoi-0q-0eueiuaisjdaKcjaisku",
      });
    });
  });
}

//Note that there is no async wrapper function

let data = await myDummyBackendCall();
console.log(data);

// Output of node index.js
{
  name: 'Shivang',
  id: 'asmdhajkdhajdsh8qweuqoweuiqepoi-0q-0eueiuaisjdaKcjaisku'
}

{
  "name": "src",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "type":"module", // I'm here!
  "scripts": {
    "test": "echo \\"Error: no test specified\\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

내에서 의 package.json“type”은 확장자가 있는 파일을 ES 모듈 구문(예: 명령문 또는 표현식 )을 사용 “module”하는 것으로 해석하도록 NodeJ에 지시합니다 ..jsimportimport()

“type” NodeJs 런타임이 지정자를 해결하거나 모듈을 로드하는 방법을 정의합니다.

“type”config 에는 두 가지 가능한 값이 있습니다 .

  1. 기준 치수
  2. commonjs (기본값)

다음은 샘플 코드입니다( type구성 없음).

{
  "name": "src",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \\"Error: no test specified\\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

내부 코드는 다음과 같습니다 index.mjs(위와 정확히 동일한 코드).

function myDummyBackendCall() {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve({
        name: "Shivang",
        id: "asmdhajkdhajdsh8qweuqoweuiqepoi-0q-0eueiuaisjdaKcjaisku",
      });
    });
  });
}
  
console.log(await myDummyBackendCall());

다음은 공식 NodeJs 문서 에서 가져온 몇 가지 사항입니다 .

  1. 로 끝나는 파일 .mjs은 가장 가까운 부모에 관계없이 항상 ES 모듈로 로드됩니다 package.json.
  2. 로 끝나는 파일 .cjs은 가장 가까운 부모에 관계없이 항상 CommonJS로 로드됩니다 package.json.

await이것은 모듈의 최상위 수준에서 호출이 이루어진 경우에만 작동 합니다. 다음은 그림입니다.

ECMAScript 모듈 로더는 비동기식 입니다. NodeJs가 모듈을 ES 모듈로 로드할 때 최상위 await는 모듈이 BIG 비동기 함수처럼 작동할 수 있음을 의미합니다. 따라서 최상위 await에는 명시적인 비동기 함수 래퍼가 필요하지 않습니다. 또한 비동기가 없는 await는 신화라는 의미이기도 합니다!

부인 성명:

이것은 순전히 NodeJs 기능입니다. 바닐라 JavaScript 에는 .mjs및 개념이 없습니다 ..cjs

감사인사 ❤️

들러 주셔서 감사합니다. 이 기사가 도움이 되었기를 바랍니다. 그렇다면 매체에서 저를 팔로우하십시오 . 그것은 내가 더 많은 콘텐츠를 내놓는 데 진정으로 격려가 될 것입니다.

추신: 개선할 수 있는 부분이 있거나 적절한 설명이 부족하다고 생각되면 댓글 상자에 메모를 남기거나 [email protected] 으로 메일을 보내주세요 . 결국, 당신도 나에게 한두 가지를 가르쳐 줄 수 있습니다.