ระดับบนสุด wait() โดยไม่มี async()⇒{…} ใน NodeJs

Jan 06 2023
ต่อไปนี้คือวิธีการทำงานของฟังก์ชัน async-await: ตอนนี้เรามาพูดถึงสถานการณ์อื่นกัน: ต่อไปนี้เป็นอีกตัวอย่างหนึ่งของไฟล์ index.js ของฉันภายในโปรเจ็กต์ NodeJs โดยที่ฉันไม่ได้ปิดการรอสายภายใน asyncfunction (เวอร์ชันโหนดที่ฉันใช้คือ 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);
})();

ตอนนี้เรามาพูดถึงสถานการณ์ที่แตกต่างกัน:

นี่เป็นอีกตัวอย่างหนึ่งของไฟล์ 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”:

  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 เป็นแบบอะซิงโครนัส หมายความว่าการรอระดับบนสุดทำให้โมดูลทำงานเหมือนฟังก์ชัน BIG async เมื่อ NodeJs โหลดเป็นโมดูล ES ดังนั้นการรอคอยระดับบนสุดจึงไม่จำเป็นต้องมีตัวห่อหุ้มฟังก์ชัน async ที่ชัดเจน นอกจากนี้ยังหมายความว่าการรอโดยไม่มี async นั้นเป็นตำนาน!

ข้อจำกัดความรับผิดชอบ:

นี่เป็นคุณสมบัติ NodeJs ล้วนๆ ไม่มีแนวคิดของ.mjsand .cjsในวานิลลา JavaScript

หมายเหตุขอบคุณ❤️

ขอบคุณสำหรับการหยุดโดย. หวังว่าบทความนี้จะเป็นประโยชน์สำหรับคุณ ถ้าคุณทำโปรดติดตามฉันบนสื่อ นั่นจะกระตุ้นให้ฉันนำเสนอเนื้อหาเพิ่มเติมอย่างแท้จริง

PS: หากคุณรู้สึกว่ามีบางสิ่งที่สามารถปรับปรุงได้หรือขาดคำอธิบายที่เหมาะสม โปรดส่งโน้ตในช่องความคิดเห็นหรือส่งอีเมลถึงฉันที่[email protected] ท้ายที่สุด คุณสามารถสอนฉันสองสามอย่างได้เช่นกัน