Vai trò method exec() trong mongoose là gì?

chào mọi người, mình có 1 stuck
hiện mình bỏ exec thì nó log ra y Chang, mình có đọc document moogoose mà cũng ko hiểu, vai trò nó ở đó làm gì?
cảm ơn mọi người
![image|690x400](upload://iO0B28H
Z0JMYwZHgy7Ae3gyIXNE.png)

ngắn gọn thì 2 cái đó là như nhau khi xài với syntax async/await. sử dụng exec sẽ giúp có stacktrace tốt hơn khi có exception -> dễ debug hơn

còn việc dùng như Promise, thì câu query không có exec là thuộc Query class của Mongoose. class này có hàm then như Promise nhưng nó không phải là Promise (hay còn gọi là then-able). Khác promise ở chỗ nếu bạn

ModelA.find().then().then() -> nó sẽ query 2 lần.
ModelA.find().exec().then().then() -> 1 lần
5 Likes

mình ko hiểu Bạn explained: "
ModelA.find().then().then() -> nó sẽ query 2 lần.
ModelA.find().exec().then().then() -> 1 lần"
1 lần, 2 lần ở đây là gì vậy?

số lần gọi xuống mongodb

1 Like

mình học promise, thấy sau mỗi lần gọi promise thì nó trả về pending, resloved hoặc reject, mỗi cái then tương ứng 1 promise trả về, vậy tại sao " ModelA.find().then().then() -> nó sẽ query 2 lần.
ModelA.find().exec().then().then() -> 1 lần" ở cả 2 cách đều có 2 lần gọi then, lại có truy vấn 1 lần và truy vấn 2 lần vậy Bạn?
Mong Bạn giải thích 1 cách tốt hơn, chứ Bạn giải thích khó hiểu lắm.

có bạn không chịu đọc chứ có gì nữa đâu mà giải thích?
then ở query không phải là then của promise. class query có hàm then, thì class đó được gọi là then-able. vì then của query không giống promise nên hành vi khác nhau, cụ thể ở đây là cứ gọi then thì nó sẽ thực hiện gọi xuống db.

2 Likes

thôi tui đọc lại document vậy, chứ Bạn giải thích khó hiểu hơn họ giải thích
ko phải promise, lại promomis của mongo mà ko phải của js, thế đang viết bằng ngôn ngữ gì vậy.

@edward_benjamin Dễ hiểu mà. Các ngôn ngữ lập trình kiểu động như JS có 1 khái niệm gọi là duck type. Phát biểu của khái niệm này là: nếu 1 thứ đi như con vịt, kêu như con vịt thì nó sẽ là con vịt. Nghĩa là các ngôn ngữ này không quan tâm kiểu dữ liệu của 1 biến là gì mà chỉ quan tâm nó có thuộc tính/phương thức gì thôi.
Do đó trong JS có các khái niệm như array-like, promise-like,… Để chỉ những kiểu dữ liệu trông giống như array hoặc promise nhưng không phải là array hoặc promise.
Khi bạn @catlord trên nói đến promise của JS tức là đang nói đến promise được JS cung cấp sẵn, còn nói đến promise của mongo tức là nói đến promise do thư viện mongo tự viết và conform theo các yêu cầu để nó trông giống như promise mà JS cung cấp sẵn.
Thenable chính là để chỉ những đối tượng có thể .then() nhận vào là các function và return ra 1 thenable khác. Nó có thể là promise do JS cung cấp hoặc là 1 kiểu dữ liệu promise-like khác

7 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?