MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Sự cố khi trả về dữ liệu được truy xuất từ ​​các truy vấn DB được gọi trong vòng lặp

Hãy bắt đầu với quy tắc chung để sử dụng các lời hứa:

Mọi hàm thực hiện điều gì đó không đồng bộ phải trả về một lời hứa

Những chức năng này là trong trường hợp của bạn? Đó là getPrayerInCat , forEach callback và Prayer.find .

Hm, Prayer.find không trả về một lời hứa và đó là một hàm thư viện nên chúng tôi không thể sửa đổi nó. Quy tắc 2 có hiệu lực:

Tạo trình bao bọc ngay lập tức cho mọi chức năng không

Trong trường hợp của chúng tôi, điều đó thật dễ dàng với các trình trợ giúp giao tiếp nút của Q:

var find = Q.nbind(Prayer.find, Prayer);

Bây giờ chúng tôi chỉ có những lời hứa xung quanh, và không cần bất kỳ sự trì hoãn nào nữa. Quy tắc thứ ba có hiệu lực:

Mọi thứ thực hiện điều gì đó với kết quả không đồng bộ sẽ được chuyển thành .then gọi lại

… Và trả về kết quả. Chết tiệt, kết quả đó thậm chí có thể là một lời hứa nếu "cái gì đó" không đồng bộ! Với điều này, chúng ta có thể viết hàm gọi lại hoàn chỉnh:

function getPrayerCount(data2) {
    var id = data2.id;
    return find({prayerCat:id})
//  ^^^^^^ Rule 1
    .then(function(prayer) {
//  ^^^^^ Rule 3
        if (!prayer)
            data2.prayersCount = 0;
        else
            data2.prayersCount = prayer.length;
        return data2;
//      ^^^^^^ Rule 3b
    });
}

Bây giờ, chúng ta có một thứ phức tạp hơn một chút:một vòng lặp. Liên tục gọi getPrayerCount() sẽ nhận được cho chúng ta nhiều lời hứa, có các tác vụ không đồng bộ chạy song song và giải quyết theo thứ tự không xác định. Chúng tôi muốn đợi tất cả chúng - tức là nhận được một lời hứa sẽ giải quyết bằng tất cả các kết quả khi mỗi nhiệm vụ hoàn thành.

Đối với những nhiệm vụ phức tạp như vậy, đừng cố nghĩ ra giải pháp của riêng bạn:

Kiểm tra API của thư viện của bạn

Và ở đó chúng tôi tìm thấy Q.all , thực hiện chính xác điều này. Viết getPrayerInCat bây giờ thật dễ dàng:

function getPrayerInCat(data) {
    var promises = data.map(getPrayerCount); // don't use forEach, we get something back
    return Q.all(promises);
//  ^^^^^^ Rule 1
}

Nếu chúng ta cần làm bất cứ điều gì với mảng Q.all giải quyết, chỉ cần áp dụng Quy tắc 3.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoose Query để lọc một mảng và điền nội dung liên quan

  2. Đẩy và thiết lập các thao tác trong cùng một bản cập nhật MongoDB

  3. MongoDB - nhận tài liệu có thuộc tính tối đa cho mỗi nhóm trong một bộ sưu tập

  4. Người dùng root MongoDB

  5. Sao băng không có mongo