ระดับบนสุด wait() โดยไม่มี async()⇒{…} ใน NodeJs
ต่อไปนี้คือวิธีการทำงานของฟังก์ชัน 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);
})();
ตอนนี้เรามาพูดถึงสถานการณ์ที่แตกต่างกัน:
นี่เป็นอีกตัวอย่างหนึ่งของไฟล์ index.js ภายในโปรเจกต์ NodeJs ซึ่งฉันไม่ได้ปิดawaitการโทรภายใน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"
}
ภายใน a ค่าของการpackage.jsonบอกให้ NodeJs ตีความไฟล์ที่มีนามสกุลเป็นการใช้ไวยากรณ์ของโมดูล ES เช่น: คำสั่งหรือนิพจน์“type”“module”.jsimportimport()
“type” กำหนดวิธีที่รันไทม์ของ NodeJs ควรแก้ไขตัวระบุหรือโหลดโมดูล
มีสองค่าที่เป็นไปได้สำหรับการกำหนดค่า“type”:
- โมดูล
- 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 อย่างเป็นทางการ :
- ไฟล์ที่ลงท้ายด้วย
.mjsจะถูกโหลดเป็นโมดูล ES เสมอ โดยไม่คำนึงถึงพาเรนต์ที่ใกล้package.jsonที่สุด - ไฟล์ที่ลงท้ายด้วย
.cjsจะโหลดเป็น CommonJS เสมอ โดยไม่คำนึงถึงพาเรนต์ที่ใกล้package.jsonที่สุด
ใช้งานได้เฉพาะเมื่อawaitมีการโทรที่ระดับบนสุดของโมดูล นี่คือภาพประกอบ:
ตัวโหลดโมดูล ECMAScript เป็นแบบอะซิงโครนัส หมายความว่าการรอระดับบนสุดทำให้โมดูลทำงานเหมือนฟังก์ชัน BIG async เมื่อ NodeJs โหลดเป็นโมดูล ES ดังนั้นการรอคอยระดับบนสุดจึงไม่จำเป็นต้องมีตัวห่อหุ้มฟังก์ชัน async ที่ชัดเจน นอกจากนี้ยังหมายความว่าการรอโดยไม่มี async นั้นเป็นตำนาน!
ข้อจำกัดความรับผิดชอบ:
นี่เป็นคุณสมบัติ NodeJs ล้วนๆ ไม่มีแนวคิดของ.mjsand .cjsในวานิลลา JavaScript
หมายเหตุขอบคุณ❤️
ขอบคุณสำหรับการหยุดโดย. หวังว่าบทความนี้จะเป็นประโยชน์สำหรับคุณ ถ้าคุณทำโปรดติดตามฉันบนสื่อ นั่นจะกระตุ้นให้ฉันนำเสนอเนื้อหาเพิ่มเติมอย่างแท้จริง
PS: หากคุณรู้สึกว่ามีบางสิ่งที่สามารถปรับปรุงได้หรือขาดคำอธิบายที่เหมาะสม โปรดส่งโน้ตในช่องความคิดเห็นหรือส่งอีเมลถึงฉันที่[email protected] ท้ายที่สุด คุณสามารถสอนฉันสองสามอย่างได้เช่นกัน





































![รายการที่เชื่อมโยงคืออะไร? [ส่วนที่ 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)