Bạn cần quản lý vòng đời của một hàm để đảm bảo hàm đó phân giải đúng cách. Bằng cách chấm dứt các hàm đúng cách, bạn có thể tránh bị tính phí quá mức đối với những hàm chạy quá lâu hoặc lặp vô hạn. Ngoài ra, bạn có thể đảm bảo rằng phiên bản Cloud Functions chạy hàm của bạn không tắt trước khi hàm đạt đến trạng thái hoặc điều kiện kết thúc thành công.
Hãy sử dụng những phương pháp được đề xuất này để quản lý vòng đời của các hàm:
- Giải quyết các hàm thực hiện quy trình xử lý không đồng bộ (còn gọi là "hàm nền") bằng cách trả về một lời hứa JavaScript.
- Chấm dứt các hàm HTTP bằng
res.redirect()
,res.send()
hoặcres.end()
. - Kết thúc hàm đồng bộ bằng câu lệnh
return;
.
Đơn giản hoá mã không đồng bộ bằng các promise trong JavaScript
Promise là một giải pháp thay thế hiện đại cho lệnh gọi lại đối với mã không đồng bộ. Một promise biểu thị một thao tác và giá trị trong tương lai mà thao tác đó có thể trả về. Việc này cũng cho phép bạn truyền lỗi tương tự như try/catch trong mã đồng bộ. Bạn có thể đọc về các promise trong Firebase SDK trên Blog của Firebase và các promise nói chung trên MDN.
Cách hoạt động của promise với các hàm
Khi bạn trả về một promise JavaScript cho một hàm, hàm đó sẽ tiếp tục chạy cho đến khi promise được giải quyết hoặc bị từ chối. Để cho biết một hàm đã hoàn tất công việc thành công, lời hứa phải được giải quyết. Để cho biết lỗi, promise phải bị từ chối. Điều này có nghĩa là bạn chỉ cần xử lý những lỗi mà bạn muốn.
Đoạn mã sau đây lấy một Firebase Realtime Database ref
và đặt giá trị của nó thành "world!"
. Bằng cách trả về kết quả của set
, hàm của bạn được đảm bảo sẽ tiếp tục chạy cho đến khi công việc không đồng bộ ghi chuỗi vào cơ sở dữ liệu hoàn tất:
// Always change the value of "/hello" to "world!"
exports.hello = functions.database.ref('/hello').onWrite(event => {
// set() returns a promise. We keep the function alive by returning it.
return event.data.ref.set('world!').then(() => {
console.log('Write succeeded!');
});
});
Ví dụ theo ngữ cảnh
Hầu hết các Cloud Functions mã mẫu của chúng tôi đều có ví dụ về việc chấm dứt hàm đúng cách. Sau đây là một vài ví dụ minh hoạ các trường hợp điển hình:
- Trình kích hoạt Realtime Database: một hàm HTTP theo sau là một lệnh chuyển hướng
- Trình kích hoạt Cloud Storage: Hoạt động tải dữ liệu xuống từ bộ nhớ, sau đó là
then
- Webhook khi ghi vào Cơ sở dữ liệu theo thời gian thực: Lỗi xảy ra bên trong mệnh đề
then
- Xoá định kỳ các tài khoản không dùng đến: Một lời hứa bị từ chối