Mức chờ đợi cao nhất () không có async()⇒{…} trong NodeJs

Jan 06 2023
Đây là cách chức năng async-await thường hoạt động: Bây giờ chúng ta hãy nói về một tình huống khác: Đây là một ví dụ khác về tệp index.js của tôi bên trong dự án NodeJs của tôi, trong đó tôi chưa đính kèm lệnh gọi chờ của mình bên trong một chức năng không đồng bộ (Phiên bản nút mà tôi đang sử dụng là 19.

Đây là cách chức năng async-await thường hoạt động:

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

Bây giờ chúng ta hãy nói về một kịch bản khác:

Đây là một ví dụ khác về tệp index.js của tôi bên trong dự án NodeJs của tôi, trong đó tôi chưa đính kèm awaitlệnh gọi của mình bên trong một asynchàm (Phiên bản nút mà tôi đang sử dụng là 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"
}

Trong một package.json, “type”giá trị của “module”yêu cầu NodeJs diễn giải các tệp có .jsphần mở rộng bằng cách sử dụng cú pháp mô-đun ES, ví dụ: importcâu lệnh hoặc import()biểu thức.

“type” xác định cách thời gian chạy NodeJs sẽ giải quyết các trình xác định hoặc tải các mô-đun.

Có hai giá trị có thể cho “type”cấu hình:

  1. mô-đun
  2. commonjs (mặc định)

Đây là mã mẫu (không có typecấu hình):

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

Đây là mã bên trong index.mjs(mã chính xác giống như trên):

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

Dưới đây là một số điểm trực tiếp từ tài liệu chính thức của NodeJs :

  1. Các tệp kết thúc bằng .mjsluôn được tải dưới dạng mô-đun ES bất kể tệp gốc gần nhất package.json.
  2. Các tệp kết thúc bằng .cjsluôn được tải dưới dạng CommonJS bất kể tệp gốc gần nhất package.json.

Điều này chỉ hoạt động khi awaitcuộc gọi được thực hiện ở cấp mô-đun cao nhất. Đây là một minh họa:

Trình tải mô-đun ECMAScript không đồng bộ . Điều đó có nghĩa là sự chờ đợi cấp cao nhất cho phép mô-đun hoạt động giống như một chức năng không đồng bộ LỚN khi NodeJ tải nó dưới dạng Mô-đun ES. Do đó, chờ đợi cấp cao nhất không cần trình bao bọc chức năng không đồng bộ rõ ràng. Điều đó cũng có nghĩa là một sự chờ đợi mà không có sự đồng bộ là một huyền thoại!

Tuyên bố miễn trừ trách nhiệm:

Đây hoàn toàn là một tính năng của NodeJ. Không có khái niệm về .mjsvà .cjstrong vanilla JavaScript.

Ghi chú cảm ơn ❤️

Cảm ơn đã ghé qua. Hy vọng, bạn tìm thấy bài viết này hữu ích. Nếu bạn làm như vậy, xin vui lòng theo dõi tôi trên phương tiện. Điều đó sẽ thực sự khuyến khích tôi đưa ra nhiều nội dung hơn.

Tái bút: Nếu bạn cảm thấy điều gì đó có thể được cải thiện hoặc thiếu lời giải thích phù hợp, hãy gửi cho tôi một ghi chú trong hộp nhận xét hoặc gửi thư cho tôi theo địa chỉ [email protected] . Rốt cuộc, bạn cũng có thể dạy tôi một hoặc hai điều.