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

Điều gì đang xảy ra với Meteor và Fibers / bindEnosystem ()?

Bạn đang sử dụng bindEnosystem hơi không chính xác. Bởi vì nơi nó được sử dụng đã ở trong một sợi quang và lệnh gọi lại đến từ ứng dụng khách Knox không còn ở trong một sợi quang nữa.

Có hai trường hợp sử dụng của bindEnosystem (tôi có thể nghĩ ra, có thể có nhiều hơn!):

  • Bạn có một biến toàn cục phải được thay đổi nhưng bạn không muốn nó ảnh hưởng đến các phiên của người dùng khác

  • Bạn đang quản lý một cuộc gọi lại bằng mô-đun api / npm của bên thứ ba (có vẻ như trường hợp này)

Meteor.bindEnvironment tạo một Sợi mới và sao chép các biến và môi trường của Sợi hiện tại sang Sợi mới. Điểm bạn cần này là khi bạn sử dụng phương thức gọi lại của mô-đun nom của mình.

May mắn thay, có một giải pháp thay thế xử lý cuộc gọi lại đang chờ bạn và liên kết cuộc gọi lại trong một sợi có tên là Meteor.wrapAsync .

Vì vậy, bạn có thể làm điều này:

Chức năng khởi động của bạn đã có một sợi quang và không có lệnh gọi lại, vì vậy bạn không cần bindEnosystem ở đây.

Meteor.startup(function () {
   if (Projects.find().count() === 0) {
     insertRecords();
   }
});

Và chức năng chèn bản ghi của bạn (sử dụng wrapAsync) nên bạn không cần gọi lại

function insertRecords() {
  console.log("inserting...");
  var client = Knox.createClient({
    key: apikey,
    secret: secret,
    bucket: 'profile-testing'
  });
      
  client.listSync = Meteor.wrapAsync(client.list.bind(client));

  console.log("created client");
      
  try {
      var data = client.listSync({ prefix: 'projects' });
  }
  catch(e) {
      console.log(e);
  }    

  if(!data) return;


  for (var i = 1; i < data.Contents.length; i++)  {
    console.log(data.Contents[i].Key);
    if (data.Contents[i].Key.split('/').pop() == "") {
      Projects.insert({ name: data.Contents[i].Key, contents: [] });
    } else if (data.Contents[i].Key.split('.').pop() == "jpg") {
      Projects.update( { name: data.Contents[i].Key.substr(0,
                         data.Contents[i].Key.lastIndexOf('.')) },
                       { $push: {contents: data.Contents[i].Key}} );
    } else {
      console.log(data.Contents[i].Key.split('.').pop());
    }
  }      
});

Một số điều cần ghi nhớ. Sợi không giống như sợi chỉ. Chỉ có một luồng duy nhất trong NodeJS.

Các sợi giống như các sự kiện có thể chạy cùng lúc nhưng không chặn nhau nếu có trường hợp loại chờ (ví dụ:tải xuống tệp từ internet).

Vì vậy, bạn có thể có mã đồng bộ và không chặn các sự kiện của người dùng khác. Chúng thay phiên nhau chạy nhưng vẫn chạy trong một luồng duy nhất. Vì vậy, đây là cách Meteor có mã đồng bộ ở phía máy chủ, có thể đợi nội dung, nhưng người dùng khác sẽ không bị chặn bởi điều này và có thể thực hiện công việc vì mã của họ chạy trong một sợi khác.

Chris Mather có một vài bài viết hay về vấn đề này trên http://eventedmind.com

Meteor.wrapAsync làm gì?

Meteor.wrapAsync lấy phương thức bạn cung cấp làm tham số đầu tiên và chạy nó trong sợi hiện tại.

Nó cũng đính kèm một lệnh gọi lại (nó giả sử phương thức nhận một tham số cuối cùng có một lệnh gọi lại trong đó tham số đầu tiên là lỗi và kết quả thứ hai như function(err,result) .

Lệnh gọi lại được liên kết với Meteor.bindEnvironment và chặn Fiber hiện tại cho đến khi lệnh gọi lại được kích hoạt. Ngay sau khi lệnh gọi lại kích hoạt, nó sẽ trả về result hoặc ném err .

Vì vậy, nó rất tiện dụng để chuyển đổi mã không đồng bộ thành mã đồng bộ vì bạn có thể sử dụng kết quả của phương thức trên dòng tiếp theo thay vì sử dụng một lệnh gọi lại và lồng các hàm sâu hơn. Nó cũng chăm sóc liên kết Môi trường cho bạn, do đó bạn không phải lo lắng về việc mất phạm vi của sợi quang.

Cập nhật Meteor._wrapAsync bây giờ là Meteor.wrapAsync và được lập thành tài liệu.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Việc áp dụng chỉ mục 2dsphere trên giản đồ mongoose có buộc phải yêu cầu trường vị trí không?

  2. tìm kiếm bằng ObjectId trong mongodb với pymongo

  3. MongoDB:cập nhật vô điều kiện?

  4. Làm thế nào để sử dụng MongoDB với các hứa hẹn trong Node.js?

  5. Công dụng của Jade hoặc Handlebars khi viết ứng dụng AngularJs