2012-11-02 33 views
8

Làm cách nào để có phương thức khách hàng.có thể đợi hàm không đồng bộ kết thúc? Hiện tại nó đạt đến cuối hàm và trả về undefined.Mã async MeteorJS bên trong hàm Meteor.methods đồng bộ

Client.js

Meteor.call('openSession', sid, function(err, res) { 
    // Return undefined undefined 
    console.log(err, res); 
}); 

Server.js

Meteor.methods({ 
    openSession: function(session_id) { 
     util.post('OpenSession', {session: session_id, reset: false }, function(err, res){ 
      // return value here with callback? 
      session_key = res; 
     }); 
    } 
}); 
+0

Tôi nghĩ rằng không thể thực hiện các tác vụ không đồng bộ bên trong phương thức sao băng từ ứng dụng khách. Trong máy chủ sử dụng Fiber có thể là một tùy chọn. – Andreas

Trả lời

6

gần đây của Meteor đã cung cấp không có giấy tờ Meteor._wrapAsync chức năng mà biến một hàm với một (err, res) callback tiêu chuẩn thành một hàm đồng bộ, có nghĩa là mức Fibre hiện tại mang lại cho đến khi trả về cuộc gọi lại, và sau đó sử dụng Meteor.bindEnviro nment để đảm bảo rằng bạn giữ lại các biến môi trường Meteor hiện tại (chẳng hạn như Meteor.userId()).

Một sử dụng đơn giản sẽ là như sau:

asyncFunc = function(arg1, arg2, callback) { 
    // callback has the form function (err, res) {} 

}; 

Meteor.methods({ 
    "callFunc": function() { 
    syncFunc = Meteor._wrapAsync(asyncFunc); 

    res = syncFunc("foo", "bar"); // Errors will be thrown  
    } 
}); 

Bạn cũng có thể cần phải sử dụng function#bind để đảm bảo rằng asyncFunc được gọi với bối cảnh ngay trước khi gói nó. Để biết thêm thông tin, hãy xem: https://www.eventedmind.com/tracks/feed-archive/meteor-meteor-wrapasync

6

tôi đã có thể tìm ra câu trả lời trong this gist. Để chạy mã không đồng bộ từ bên trong một method.call bạn sử dụng Futures để buộc chức năng của bạn phải đợi.

var fut = new Future(); 
    asyncfunc(data, function(err, res){ 
     fut.ret(res); 
    }); 
    return fut.wait(); 
+0

Tôi sẽ đề xuất tương lai/lời hứa nhưng không nhận ra rằng nó được xây dựng thành Meteor. Hữu ích khắp nơi. – Dror

+1

Bạn là một G. thẳng Đây là một số mã mức người gọi bắn ngay tại đây – OneChillDude

+1

Tương lai không còn là một phần của lõi Meteor, do đó, điều này không còn hoạt động. – iiz

0

Cập nhật: Rất tiếc, tôi đã đọc kỹ câu hỏi này. Có vẻ như câu hỏi này cũng đã được hỏi và trả lời here.

Ngoài tương lai, một mẫu khác để xem xét có thể đang cập nhật một mô hình khác với dữ liệu được trả về từ cuộc gọi không đồng bộ và sau đó đăng ký thay đổi của mô hình đó.


Từ meteor.call documentation nó trông giống như lập luận kết quả (err, res) của hàm callback của bạn nên chứa đầu ra của chức năng openSession của bạn. Nhưng bạn không trả về bất kỳ giá trị nào từ hàm openSession của bạn để giá trị trả về không được xác định.

Bạn có thể kiểm tra điều này:

Chủ đầu tư:

Meteor.call('foo', function(err, res) { 
    console.log(res); // undefined 
}); 

Meteor.call('bar', function(err, res) { 
    console.log(res); // 'bar' 
}); 

Server:

phiên bản
Meteor.methods({ 
    foo: function() { 
    var foo = 'foo'; 
    }, 
    bar: function() { 
    var bar = 'bar'; 
    return bar; 
    } 
}); 
Các vấn đề liên quan