Tingkat atas menunggu() tanpa async()⇒{…} di NodeJs

Jan 06 2023
Inilah cara kerja async-await biasanya: Sekarang mari kita bicara tentang skenario yang berbeda: Berikut adalah contoh lain dari file index.js saya di dalam proyek NodeJs saya di mana saya belum menyertakan panggilan menunggu saya di dalam fungsi async (versi Node yang saya gunakan adalah 19.

Begini cara kerja fungsi async-await biasanya:

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

Sekarang mari kita bicara tentang skenario yang berbeda:

Berikut adalah contoh lain dari file index.js saya di dalam proyek NodeJs saya di mana saya belum menyertakan awaitpanggilan saya di dalam suatu asyncfungsi (versi Node yang saya gunakan adalah 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"
}

Di dalam package.json, “type”nilai “module”memberitahu NodeJs untuk menafsirkan file dengan .jsekstensi menggunakan sintaks modul ES, misalnya: importpernyataan atau import()ekspresi.

“type” mendefinisikan bagaimana runtime NodeJs harus menyelesaikan penentu atau memuat modul.

Ada dua kemungkinan nilai untuk “type”config:

  1. modul
  2. commonjs (default)

Berikut kode contoh (tanpa typekonfigurasi):

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

Inilah kode di dalamnya index.mjs(kode yang persis sama seperti di atas):

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

Berikut adalah beberapa poin langsung dari dokumentasi resmi NodeJs :

  1. File yang diakhiri dengan .mjsselalu dimuat sebagai modul ES terlepas dari induk terdekatnya package.json.
  2. File yang diakhiri dengan .cjsselalu dimuat sebagai CommonJS terlepas dari parent terdekat package.json.

Ini hanya berfungsi ketika awaitpanggilan dilakukan di tingkat atas modul. Berikut ilustrasinya:

Pemuat modul ECMAScript tidak sinkron . Ini berarti bahwa await tingkat atas memungkinkan modul untuk bertindak seperti fungsi async BESAR ketika NodeJ memuatnya sebagai Modul ES. Oleh karena itu, await tingkat atas tidak memerlukan pembungkus fungsi async yang eksplisit. Ini juga berarti menunggu tanpa async adalah mitos!

Penafian:

Ini murni fitur NodeJs. Tidak ada konsep .mjsdan .cjsdalam vanilla JavaScript.

Catatan terima kasih ❤️

Terima kasih sudah mampir. Semoga artikel ini bermanfaat bagi Anda. Jika ya, ikuti saya di media. Itu benar-benar akan mendorong saya untuk mengeluarkan lebih banyak konten.

PS: Jika Anda merasa ada sesuatu yang dapat diperbaiki atau kurang penjelasan yang tepat, berikan saya catatan di kotak komentar atau kirimkan saya email di [email protected] . Lagi pula, Anda bisa mengajari saya satu atau dua hal juga.