Cách tạm dừng thực thi trong chương trình Node.js
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ủ được tích hợp sẵn. Vì vậy, bạn không thể chỉ đơn giản gọi một hàm sleep () để tạm dừng một chương trình Node.js. Tuy nhiên, có những cách khác mà bạn có thể làm cho một chương trình đợi trong một thời gian nhất đị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 giấc ngủ hứa.
Mục Lục
Sử dụng setTimeout () để đợi một thời gian cụ thể
Các setTimeout () hàm lập lịch trình mã cho thời gian chạy để thực thi khi một khoảng thời gian nhất định đã trôi qua. Nó chấp nhận một hàm 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 hàm 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 setTimeout () hàm số:
setTimeout(printSentence, 2000)
Mặc dù điều này hoạt động, nhưng nó không đảm bảo rằng 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 thời gian 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ập 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ì hoãn trôi qua, chương trình của bạn sẽ thực thi mã đã lên lịch, nhưng chỉ khi nó rảnh. Nếu mã khác nằm trong ngăn xếp cuộc gọi, nó sẽ thực thi đầu tiên, ngay cả khi mã đã lên lịch đến hạn phải chạy. Đây là nơi có thể xảy ra thêm thời gian trễ, do đó tính không chính xác.
Hãy xem xét chương trình sau đây.
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 chậm đoạn mã mà nó chuyển đến setTimeout (). Phần còn lại của chương trình sẽ tiếp tục, với mã đã lên lịch chỉ làm gián đoạn nó khi thời lượng đã trôi qua. 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, hãy sử dụng setTimeout () sẽ không làm việc.
Một giải pháp thay thế là viết mã đồng bộ sẽ chặn việc thực thi bao lâu bạn cần. Ví dụ, bạn có thể sử dụng làm trong khi vòng lặp để chặn luồng thực thi cho đến khi hết thời gian trễ:
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!");
Các trì hoãn() chức năng 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à tốn nhiều CPU, đặc biệt là với độ trễ lớn. Vòng lặp do … while phải tính toán thời gian còn lại sau mỗi mili giây.
Sử dụng Async / Await để trì hoãn chương trình Node.js
Một chờ đợi biểu thức làm cho 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ó đồng bộ, nhưng hiệu quả hơn bằng cách chặn thực thi theo cách thủ công. Bạn chỉ có thể sử dụng await bên trong một chức năng được đánh dấu 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à kết quả của chương trình trên:
Hello World
Will be printed after 2 seconds
Sử dụng Gói giấc ngủ hứa hẹn
Các lời hứa ngủ yên gói đơn giản hóa quá trình tạm dừng các chương trình Node.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:
npm install sleep-promise
Đâ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, kết quả sẽ như sau.
Hello World.
Will be printed after two seconds.
Chọn một phương pháp tiếp cận phù hợp
Việc triển khai chức năng ngủ trong Node.js có thể khá phức tạp. Khi quyết định thực hiện nó như thế nào, hãy cân nhắc 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 việc thực thi toàn bộ chương trình của mình, bạn nên sử dụng async / await.
Đọc tiếp
Giới thiệu về tác giả