当前位置: 代码迷 >> JavaScript >> 使用wrapAsync进行同步调用
  详细解决方案

使用wrapAsync进行同步调用

热度:56   发布时间:2023-06-03 17:53:47.0

我写了一段代码从文件中获取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这是我能想到的最佳解决方案。 不知道我错过了什么。 我遵循了博客的指示。

您不能在客户端上使用Meteor.wrapAsync ,因为在服务器上,同步的错觉取决于并且客户端上没有这样的并行机制。

光纤有效地内联异步函数,以便其他代码可以在等待回调的同时运行。 除其他外,它有助于消除反模式的 。 但是,这确实使代码推理变得更加困难,因为如果在纤维之间共享Javascript对象,则必须明确考虑代码何时会产生(自动抢占,例如通过进行数据库调用)。

无论如何,在客户端上提供类似的东西之前可能要过一段时间-如您所见,Fibers是作为节点的C ++包实现的,不能简单地用Javascript完成,因为它实际上进行了异步函数调用看起来同步。

在您的情况下,延迟加载CSS的正确方法(而不是仅将其包含在Meteor捆绑包的其余部分中)是将其放在public/文件夹中(或从带有{isAsset: true}的包中包含{isAsset: true} ),并在需要时使用<head>标记加载。

我不完全了解您要在这里实现的目标。

从我的角度来看,应该从第一次加载开始加载和编译cas。 不要认为快速加载CSS是个好主意...您将无法卸载。

如果您在跟踪器计算内部(例如,进入渲染事件时进入路由器),则可以使用ReactiveMethod包进行类似同步调用的操作。 它使用跟踪器依赖项来等待响应。

另一件事,您最终可以设置服务器端路由,以从私有文件夹提供CSS文件...

如果需要的话

干杯

我没有将返回值存储在局部变量中,而是使用了Session。 现在可以了!

Template.home.helpers({

    'css': function() {

        Meteor.call('getCSS', 'home.css', function(err, res) {
            Session.set('css', res);
        });
        return Session.get('css');

    }

});
  相关解决方案