问题描述
我写了一段代码从文件中获取CSS内容,我想在助手函数中获取该数据。
服务器端:
Meteor.methods({
'getCSS': function(filename) {
return '<style>' + Assets.getText('css/' + filename) + '</style>';
}
});
css
文件夹位于一个private
文件夹中,并且包含几个页面所需的CSS文件。
据我所知,服务器端代码可以正常工作。
客户端:
Template.home.helpers({
'css': function() {
var asyncFn = function(fn, cb) {
Meteor.call('getCSS', fn, function(err, res) {
console.log(res); // prints data correctly
cb && cb(null, res);
});
}
var syncFn = Meteor.wrapAsync(asyncFn);
var result = syncFn('home.css');
console.log(result); // undefined
return result;
}
});
在研究了如何使用Meteor.wrapAsync
这是我能想到的最佳解决方案。
不知道我错过了什么。
我遵循了博客的指示。
1楼
Andrew Mao
2
已采纳
2015-07-25 15:29:06
您不能在客户端上使用Meteor.wrapAsync
,因为在服务器上,同步的错觉取决于并且客户端上没有这样的并行机制。
光纤有效地内联异步函数,以便其他代码可以在等待回调的同时运行。 除其他外,它有助于消除反模式的 。 但是,这确实使代码推理变得更加困难,因为如果在纤维之间共享Javascript对象,则必须明确考虑代码何时会产生(自动抢占,例如通过进行数据库调用)。
无论如何,在客户端上提供类似的东西之前可能要过一段时间-如您所见,Fibers是作为节点的C ++包实现的,不能简单地用Javascript完成,因为它实际上进行了异步函数调用看起来同步。
在您的情况下,延迟加载CSS的正确方法(而不是仅将其包含在Meteor捆绑包的其余部分中)是将其放在public/
文件夹中(或从带有{isAsset: true}
的包中包含{isAsset: true}
),并在需要时使用<head>
标记加载。
2楼
JVercout
0
2015-07-25 15:44:32
我不完全了解您要在这里实现的目标。
从我的角度来看,应该从第一次加载开始加载和编译cas。 不要认为快速加载CSS是个好主意...您将无法卸载。
如果您在跟踪器计算内部(例如,进入渲染事件时进入路由器),则可以使用ReactiveMethod包进行类似同步调用的操作。 它使用跟踪器依赖项来等待响应。
另一件事,您最终可以设置服务器端路由,以从私有文件夹提供CSS文件...
如果需要的话
干杯
3楼
Saurabh
0
2015-07-26 11:04:20
我没有将返回值存储在局部变量中,而是使用了Session。 现在可以了!
Template.home.helpers({
'css': function() {
Meteor.call('getCSS', 'home.css', function(err, res) {
Session.set('css', res);
});
return Session.get('css');
}
});