我正在尝试在Meteor中创建一个读取文件并输出结果的方法。以下是我的代码。
服务器:
Meteor.methods({
retTemplate: function(templateName){
var fs = Npm.require('fs');
var ret;
fs.readFile("./../../../../../client/" + templateName + ".html",{encoding: 'utf8'}, function(err, data) {
if(err)
return "ERROR";
console.log(data);
return data;
});
}
});
客户:
Meteor.call('retTemplate', submitName, Meteor.user(), function(e, r){
console.log(r);
$('#editTempData').val(r);
});
服务器端的代码工作(服务器端控制台使用html文件的内容更新),但该方法返回undefined给客户端。我相信这是由于Meteor的异步功能。有没有解决的办法?我一直在摆弄有点无济于事。
感谢。
编辑:我认为如果没有调用readFile方法会有效,因为这会设置一些双异步调用,这可能是问题,但我不知道如何修复它。答案 0 :(得分:1)
您无法从异步方法返回值,然后将其返回到客户端。这是另一种(但不是理想的)解决方案。
在客户端/服务器上创建new Meteor.Collection
,只需订阅订阅/发布此集合即可。将从fs.readFile()
返回的数据保存到您的收藏中,并在发生这种情况时自动通知您的客户。
答案 1 :(得分:1)
我找到了答案。我需要使用期货。
工作服务器:
Meteor.methods({
retTemplate: function(templateName){
var Future = Npm.require('fibers/future');
var fut = new Future();
var fs = Npm.require('fs');
var ret;
fs.readFile("./../../../../../client/" + templateName + ".html",{encoding: 'utf8'}, function(err, data) {
if(err)
return "ERROR";
console.log(data);
fut['return'](data);
});
return fut.wait();
}
});