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

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 await
panggilan saya di dalam suatu async
fungsi (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 .js
ekstensi menggunakan sintaks modul ES, misalnya: import
pernyataan atau import()
ekspresi.
“type”
mendefinisikan bagaimana runtime NodeJs harus menyelesaikan penentu atau memuat modul.
Ada dua kemungkinan nilai untuk “type”
config:
- modul
- commonjs (default)
Berikut kode contoh (tanpa type
konfigurasi):
{
"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 :
- File yang diakhiri dengan
.mjs
selalu dimuat sebagai modul ES terlepas dari induk terdekatnyapackage.json
. - File yang diakhiri dengan
.cjs
selalu dimuat sebagai CommonJS terlepas dari parent terdekatpackage.json
.
Ini hanya berfungsi ketika await
panggilan 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 .mjs
dan .cjs
dalam 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.
