Ответ 1
Общее решение:
Сторона клиента:
if (Meteor.isClient) {
Template.herokuDashboard.helpers({
appInfo: function() {
return Session.get("herokuDashboard_appInfo");
}
});
Template.herokuDashboard.created = function(){
Meteor.call('getData', function (error, result) {
Session.set("herokuDashboard_appInfo",result);
} );
}
}
Невозможно вернуть напрямую результат Meteor.call. Однако есть как минимум 2 решения (@akshat и @Hubert OG): Как использовать методы Meteor внутри помощника шаблона
Сторона сервера (Meteor._wrapAsync):
Использование Meteor._wrapAsync:
if (Meteor.isServer) {
var asyncFunc = function(callback){
setTimeout(function(){
// callback(error, result);
// success :
callback(null,"result");
// failure:
// callback(new Error("error"));
},2000)
}
var syncFunc = Meteor._wrapAsync(asyncFunc);
Meteor.methods({
'getData': function(){
var result;
try{
result = syncFunc();
}catch(e){
console.log("getData method returned error : " + e);
}finally{
return result;
}
}
});
}
Правильное использование библиотеки Future:
if (Meteor.isServer) {
Future = Npm.require('fibers/future');
Meteor.methods({
'getData': function() {
var fut = new Future();
setTimeout(
Meteor.bindEnvironment(
function() {
fut.return("test");
},
function(exception) {
console.log("Exception : ", exception);
fut.throw(new Error("Async function throw exception"));
}
),
1000
)
return fut.wait();
}
});
}
Использование будущей библиотеки БЕЗ Meteor.bindEnvironment НЕ РЕКОМЕНДУЕТСЯ, см.
- https://www.eventedmind.com/feed/meteor-what-is-meteor-bindenvironment
- @imslavko комментарий от 18.07.2014
- @Ответ на вопрос: Что происходит с метеор и волокнами /bindEnvironment ()?
Существует также 3-й подход с использованием Утилиты Async