Nút ngủ

Các bạn đọc like ủng hộ MUO nhé. Khi bạn mua hàng bằng các liên kết trên trang web của chúng tôi, chúng tôi có thể kiếm được hoa hồng liên kết. Đọc thêm

Không giống như các ngôn ngữ lập trình khác, JavaScript không có phương thức ngủ tích hợp. Vì vậy, bạn không thể đơn giản gọi một hàm sleep() để tạm dừng một Nút. chương trình js. Tuy nhiên, có nhiều cách khác mà bạn có thể làm cho chương trình đợi trong một khoảng thời gian xác định

Hướng dẫn này thảo luận về ba cách tiếp cận. setTimeout, async/await và gói lời hứa ngủ

Sử dụng setTimeout() để đợi một thời gian cụ thể

Hàm setTimeout() lập lịch mã cho thời gian chạy để thực thi sau khi một khoảng thời gian đã đặt đã trôi qua. Nó chấp nhận một chức năng và thời gian trễ tính bằng mili giây. Đây là cú pháp

 setTimeout(function(), timeInMs)

Ví dụ: giả sử bạn có một chức năng in trên bảng điều khiển

 function printSentence() {
  console.log("Using setTimeout()")
}

Để chạy hàm trên sau hai giây trôi qua, hãy chuyển hàm và thời gian trễ 2000ms cho hàm setTimeout()

 setTimeout(printSentence, 2000)

Mặc dù điều này hoạt động nhưng không đảm bảo chức năng của bạn sẽ chạy chính xác sau hai giây. Chắc chắn sẽ mất ít nhất khoảng thời gian đó, nhưng có thể mất nhiều hơn

setTimeout() có chính xác không?

Có, nhưng với một số lưu ý. setTimeout() là một hàm JavaScript không đồng bộ có nghĩa là nó không bị chặn. Mã bạn lên lịch được thêm vào vòng lặp sự kiện trong khi phần còn lại của chương trình tiếp tục

Sau khi thời gian trễ trôi qua, chương trình của bạn sẽ thực thi mã đã lên lịch, nhưng chỉ khi rảnh rỗi để thực hiện. Nếu mã khác nằm trong ngăn xếp cuộc gọi, thì mã đó sẽ thực thi trước, ngay cả khi mã đã lên lịch sắp chạy. Đây là nơi có thể xảy ra thời gian trễ thêm, do đó không chính xác

Xét chương trình sau

 console.log("Hello World!")

function printSentence() {
  console.log("Using setTimeout()")
}

setTimeout(printSentence, 2000)
console.log("Done")

Đây là những gì bảng điều khiển sẽ hiển thị khi bạn chạy nó

 Hello World!
Done
Using setTimeout()

Chương trình này giới thiệu một độ trễ, nhưng nó chỉ làm trễ mã mà nó chuyển đến setTimeout(). Phần còn lại của chương trình tiếp tục, với mã được lên lịch chỉ làm gián đoạn chương trình sau khi hết thời lượng. Nếu bạn muốn chạy tất cả mã này theo thứ tự, với một khoảng dừng ở giữa, sử dụng setTimeout() sẽ không hoạt động

Một cách khác là viết mã đồng bộ sẽ chặn thực thi miễn là bạn cần. Ví dụ, bạn có thể sử dụng do. vòng lặp while để chặn luồng thực thi cho đến khi hết thời gian trì hoãn

 function delay(ms) {
  const date = Date.now();
  let currentDate = null;

  do {
    currentDate = Date.now();
  } while (currentDate - date < ms);
}

console.log("Hello World");
delay(2000);
console.log("Will be printed after 2 seconds!");

Hàm delay() lặp lại cho đến khi thời gian hiện tại bằng hoặc lớn hơn thời gian bắt đầu của nó cộng với độ trễ. Nhược điểm của phương pháp này là sử dụng nhiều CPU, đặc biệt là với độ trễ lớn. việc làm. vòng lặp while phải tính thời gian còn lại sau mỗi mili giây

Sử dụng Async/Await để trì hoãn một nút. chương trình js

Một biểu thức chờ khiến việc thực thi tạm dừng cho đến khi một Lời hứa được giải quyết. Nó cho phép bạn chạy mã không đồng bộ như thể nó là mã đồng bộ, nhưng hiệu quả hơn bằng cách chặn thực thi thủ công. Bạn chỉ có thể sử dụng sự chờ đợi bên trong một chức năng được đánh dấu là không đồng bộ

 function delay(time) {
  return new Promise(resolve => setTimeout(resolve, time));
}

async function printSentence() {
  console.log("Hello World")
  await delay(2000);
  console.log("Will be printed after 2 seconds");
}

printSentence();

Đây là đầu ra của chương trình trên

 Hello World
Will be printed after 2 seconds

Sử dụng Gói lời hứa ngủ

Gói lời hứa ngủ đơn giản hóa quá trình tạm dừng Node. chương trình js. Bạn chỉ cần gọi nó và chỉ định thời gian trễ tính bằng mili giây

Bắt đầu bằng cách cài đặt nó qua npm

________số 8

Đây là một ví dụ về cách bạn có thể sử dụng nó trong chương trình của mình

 const sleep = require('sleep-promise');

(async () => {
  console.log("Hello World.");
  await sleep(2000);
  console.log("Will be printed after two seconds.");
})();

Khi bạn chạy chương trình, đầu ra sẽ như sau

 function printSentence() {
  console.log("Using setTimeout()")
}
0

Chọn một cách tiếp cận phù hợp

Triển khai chức năng ngủ trong Node. js có thể phức tạp. Khi quyết định cách thực hiện, hãy xem xét những gì bạn muốn đạt được. Nếu bạn chỉ muốn trì hoãn một số mã, trong một khoảng thời gian tối thiểu, setTimeout() là một lựa chọn tốt. Nhưng nếu bạn muốn tạm dừng thực hiện toàn bộ chương trình của mình, bạn nên sử dụng async/await