2017-02-17 22 views
5

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:

  • 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ủa

    collection.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?

+0

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

+0

@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ộ? –

+0

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

Trả lời

5

Tôi thừa nhận bạn, trường hợp này hơi lạ. Đây là cho v2.2 của mongodb-native.

Trước hết, findtwo different usages. Bạn có thể cung cấp cho một chức năng gọi lại hay không. Nhưng trong mọi trường hợp, nó trả về đồng bộ một đối tượng. Chính xác hơn là một số cursor. Chúng ta có thể mong đợi một cơ chế không đồng bộ khi chuyển một cuộc gọi lại nhưng không phải ở đây.

collection.find({ }, function (err, cursor) { 
    assert(!err); 
}); 
console.log('This happens after collection.find({ }, callback)'); 

HOẶC

const cursor = collection.find({}); 
console.log('Also happening after'); 

Mặt khác, toArray là một chức năng không đồng bộ và cũng có hai cách dùng khác nhau. Lần này, đối tượng trả về khác nhau tùy thuộc vào các đối số.

Are tương đương:

cursor.toArray(function (err, documents) { 
    assert.equal(1, documents.length); 
}); 

cursor.toArray() 
    .then(documents => { 
    assert.equal(1, documents.length); 
    }); 

Trong cuộc gọi đầu tiên, toArray lợi nhuận undefined trong khi trong lần thứ hai, nó sẽ trả về một Promise.

Các vấn đề liên quan