Đôi khi, việc khởi động ứng dụng cần được trì hoãn cho đến khi một hoặc nhiều tác vụ bất đồng bộ hoàn tất. Ví dụ, bạn có thể không muốn bắt đầu nhận request cho tới khi kết nối tới database đã được thiết lập. Bạn có thể làm điều này bằng cách sử dụng provider bất đồng bộ (asynchronous provider).
Cú pháp cho việc này là dùng async/await kết hợp với cú pháp useFactory. Factory trả về một Promise, và hàm factory có thể await các tác vụ bất đồng bộ. Nest sẽ chờ promise resolve xong trước khi khởi tạo bất kỳ class nào phụ thuộc vào (inject) provider đó.
{
provide: 'ASYNC_CONNECTION',
useFactory: async () => {
const connection = await createConnection(options);
return connection;
},
}
Gợi ý Tìm hiểu thêm về cú pháp custom provider tại đây.
Ghi chú người dịch Cơ chế này giống với việc một Go service chờ sql.Open + ping thành công trước khi http.ListenAndServe, hoặc một Express app chờ mongoose.connect() resolve trước khi gọi app.listen(). Điểm khác là ở Nest, việc “chờ” này nằm ngay trong quá trình xây dựng dependency graph của IoC container — Nest tự biết class nào cần đợi provider này xong mới được khởi tạo, bạn không phải tự viết code chờ thủ công.
Injection (Inject)
Provider bất đồng bộ được inject vào các component khác thông qua token của nó, giống như bất kỳ provider nào khác. Trong ví dụ trên, bạn sẽ dùng cú pháp @Inject('ASYNC_CONNECTION').