Javascript Meteor补偿异步性
我试图在Meteor中创建一个方法,读取一个文件并输出结果。下面是我的代码 服务器:Javascript Meteor补偿异步性,javascript,node.js,asynchronous,meteor,Javascript,Node.js,Asynchronous,Meteor,我试图在Meteor中创建一个方法,读取一个文件并输出结果。下面是我的代码 服务器: Meteor.methods({ retTemplate: function(templateName){ var fs = Npm.require('fs'); var ret; fs.readFile("./../../../../../client/" + templateName + ".html",{encoding: 'utf8'}, function(err, data
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文件的内容进行更新),但该方法会将未定义的返回给客户端。我相信这是由于Meteor的异步功能。有办法解决这个问题吗?我胡闹了一会儿,都没用
谢谢
编辑:我认为如果没有调用readFile方法,它会起作用,因为这会设置一个双重异步调用,这可能是问题所在,但我不知道如何修复它。你不能从异步方法返回值,然后像那样返回给客户端。这里有一个替代(但不是理想的)解决方案
在客户端/服务器上创建一个
新Meteor.Collection
,只需订阅/发布此集合即可。将从fs.readFile()
返回的数据保存到您的集合中,发生这种情况时,您的客户端将自动收到通知。我找到了答案。我需要利用未来
工作服务器:
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();
}
});
谢谢你的回复。我在Node.js中找到了一个未来的类,它也解决了这个问题。