Tôi đang cố gắng tìm hiểu nút. xem xét mã này (dựa trên điều khiển chính thức MongoDB Node.js)Tìm hiểu về Node/Mongo
// Retrieve all the documents in the collection
collection.find().toArray(function(err, documents) {
assert.equal(1, documents.length);
assert.deepEqual([1, 2, 3], documents[0].b);
db.close();
});
Tôi có hai câu hỏi:
- là
find
đồng bộ hoặc không đồng bộ? Nếu nó là không đồng bộ, cuộc gọi
.toArray
chức năng là khó hiểu cho tôi, bởi vì bình thường tôi mong chờ một cái gì đó dọc theo dòng củacollection.find(function(err, results){});
Cụ thể là tôi đang quan tâm đến gì cơ chế cho phép bạn gọi một .toArray
trên kết quả của hàm không đồng bộ? Bởi vì các hàm không đồng bộ như tôi nhận được nó hiếm khi trả lại một cái gì đó (tôi nghĩ ngoại trừ lời hứa), thay vì gọi callbacks được truyền cho chúng. Ai đó có thể làm rõ tình huống này bằng cách tìm và .toArray
?
Ví dụ trong câu trả lời chấp nhận của câu hỏi này: How to get a callback on MongoDB collection.find(), bạn có thể thấy tác giả gọi find
cách tôi hình dung, và nhận cursor
trong hàm callback. Điều đó tốt với tôi, đó là cách tôi mong đợi nó hoạt động. Nhưng chuỗi kết quả của cuộc gọi không đồng bộ find
(nếu nó là asynch?), Với toArray
một chút nhầm lẫn giữa tôi.
Suy đoán của tôi là find
trả về loại xử lý, dữ liệu tại thời điểm này chưa được tải từ DB, chỉ khi bạn gọi toArray
dữ liệu thực tế đến. Tôi có đúng không?
Có thể do nhầm lẫn này xuất phát từ thay đổi API không? 'find' trong v2.2 trả về một' Con trỏ' đi kèm với các phương thức khác nhau ('toArray' là một trong số chúng). Trong v1.4 'find' chấp nhận một số đối số, một trong số chúng là một' callback' tùy chọn (trong khi vẫn trả về một 'con trỏ'). – forrert
@forrert yep, đó cũng là yếu tố gây nhầm lẫn. Vì vậy, trong 2.2 tìm trả về đối tượng con trỏ đồng bộ? –
Khi câu trả lời dưới đây chỉ ra một cách độc đáo, trong cả hai trường hợp, con trỏ được trả về đồng bộ. Lưu ý rằng chức năng chạy một thứ không đồng bộ có thể vẫn trả lại thứ gì đó (ví dụ: con trỏ). Ngoài ra các hàm con trỏ mong đợi các cuộc gọi lại để nhận các kết quả của truy vấn. – forrert