await() auf oberster Ebene ohne async()⇒{…} in NodeJs

Jan 06 2023
So funktioniert die async-await-Funktion normalerweise: Lassen Sie uns nun über ein anderes Szenario sprechen: Hier ist ein weiteres Beispiel meiner index.js-Datei in meinem NodeJs-Projekt, in dem ich meinen await-Aufruf nicht in eine async-Funktion eingeschlossen habe (die von mir verwendete Node-Version ist 19.

So funktioniert die async-await-Funktion normalerweise:

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);
})();

Lassen Sie uns nun über ein anderes Szenario sprechen:

Hier ist ein weiteres Beispiel meiner index.js-Datei in meinem NodeJs-Projekt, in dem ich meinen awaitAufruf nicht in eine asyncFunktion eingeschlossen habe (die von mir verwendete Node-Version ist 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"
}

Innerhalb eines package.json, weist “type”der Wert von “module”NodeJs an, die Dateien mit der .jsErweiterung so zu interpretieren, dass sie die ES-Modulsyntax verwenden, z. B.: importAnweisung oder import()Ausdrücke.

“type” definiert, wie die NodeJ-Laufzeit Spezifizierer auflösen oder Module laden soll.

Es gibt zwei mögliche Werte für “type”config:

  1. Modul
  2. commonjs (Standard)

Hier ist der Beispielcode (ohne typeKonfiguration):

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

Hier ist der Code darin index.mjs(genau derselbe Code wie oben):

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

Hier sind einige Punkte direkt aus der offiziellen NodeJs-Dokumentation :

  1. Dateien, die mit enden, .mjswerden immer als ES-Module geladen, unabhängig vom nächsten übergeordneten Element package.json.
  2. Dateien, die mit enden, .cjswerden immer als CommonJS geladen, unabhängig vom nächsten übergeordneten Element package.json.

Dies funktioniert nur, wenn awaitauf der obersten Ebene von Modulen aufgerufen wird. Hier ist eine Illustration:

Der ECMAScript-Modullader ist asynchron . Dies bedeutet, dass das Warten auf oberster Ebene dem Modul ermöglicht, sich wie eine BIG-asynchrone Funktion zu verhalten, wenn NodeJs es als ES-Modul lädt. Daher benötigt das Erwarten auf oberster Ebene keinen expliziten Wrapper für asynchrone Funktionen. Es bedeutet auch, dass ein await ohne async ein Mythos ist!

Haftungsausschluss:

Dies ist eine reine NodeJs-Funktion. Es gibt kein Konzept von .mjsund .cjsin Vanilla JavaScript.

Danksagung ❤️

Vielen Dank für Ihren Besuch. Ich hoffe, Sie finden diesen Artikel nützlich. Wenn ja, folgen Sie mir bitte auf Medium. Das wird mich wirklich ermutigen, mehr Inhalte zu veröffentlichen.

PS: Wenn Sie der Meinung sind, dass etwas verbessert werden kann oder eine angemessene Erklärung fehlt, schreiben Sie mir eine Nachricht in das Kommentarfeld oder senden Sie mir eine E-Mail an [email protected] . Schließlich kannst du mir auch das ein oder andere beibringen.