2013-08-21 50 views
7

Trong Meteor, tôi đang viết một phương pháp sẽ phải kiểm tra các thư mục con của đường dẫn nhất định cho các tệp mới. Lần đầu tiên tôi muốn liệt kê các thư mục con trong phạm vi Meteor sau đó tôi child_process.exec một tập lệnh bash đơn giản liệt kê các tệp được thêm kể từ lần cuối cùng nó được thực hiện.Future.wait() không thể chờ đợi mà không có chất xơ (trong khi chờ đợi một tương lai khác trong Meteor.method)

Tôi đang gặp một số sự cố khi phát hiện thư mục không đồng bộ (Error: Can't wait without a fiber). Tôi đã viết một phiên bản đồng bộ nhưng có cả hai fs.readdirfs.stat thay cho các lựa chọn thay thế đồng bộ của chúng cho phép tôi phát hiện lỗi.

Dưới đây là các mã:

function listDirs(dir, isDir){ 

    var future1 = new Future();fs.readdir(dir, function(err, files){ 

      if (err) 
       throw new Meteor.error(500, "Error listing files", err); 

      var dirs = _.map(files, function(file){ 

       var future2 = new Future(); 
       var resolve2 = future2.resolver(); 

       fs.stat(dir+file, function(err, stats){ 

        if (err) 
         throw new Meteor.error(500, "Error statting files", err); 

        if (stats.isDirectory() == isDir && file.charAt(0) !== '.') 
         resolve2(err, file); 

       }); 

       return future2; 

      }); 

      Future.wait(dirs); 

      //var result = _.invoke(dirs, 'get'); 

      future1['return'](_.compact(dirs)); 
     }); 

     return future1.wait(); 
    } 

Các lỗi Error: Can't wait without a fiber đã làm với future2. Khi tôi nhận xét ra Future.wait(dirs) máy chủ không gặp trục trặc nữa, nhưng đó là về việc tôi đã cố gắng giải quyết vấn đề này. :/

Hàm _.map khác tôi sử dụng trong một phần khác của phương thức hoạt động tốt với tương lai. (Xem thêm https://gist.github.com/possibilities/3443021 nơi tôi tìm thấy nguồn cảm hứng của tôi)

Trả lời

14

Quấn callback của bạn vào Meteor.bindEnvironment, ví dụ:

fs.readdir(dir, Meteor.bindEnvironment(function (err, res) { 
    if (err) future.throw(err); 
    future.return(res); 
}, function (err) { console.log("couldn't wrap the callback"); }); 

Meteor.bindEnvironment hiện rất nhiều của sự vật và một trong số họ là để đảm bảo callback đang chạy trong một sợi.

Một điều có thể hữu ích là var funcSync = Meteor._wrapAsync(func) sử dụng tương lai và cho phép sử dụng để gọi hàm theo kiểu đồng bộ (nhưng nó vẫn không đồng bộ).

Xem những đoạn video trên tâm evented nếu bạn muốn biết thêm: https://www.eventedmind.com/posts/meteor-dynamic-scoping-with-environment-variableshttps://www.eventedmind.com/posts/meteor-what-is-meteor-bindenvironment

+0

Cảm ơn bạn! Việc gói lại gọi lại trong 'Meteor.bindEnvironment' đã thực sự giải quyết vấn đề tương lai. – jeroentbt

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