wrapAsync + method + session

时间:2014-10-13 18:17:05

标签: asynchronous methods meteor

我遇到了wrapAsync +方法+会话的问题。

如何正确实现WrapAsync? 我想在模板中知道用户是否至少有一个由他创建的项目。然后定义他是否可以创建另一个项目。

现在我收到了这个错误:

W20141013-15:04:43.237(-3)? (STDERR) Error: Can't wait without a fiber

但是,我找不到Fiber at Documentation。为了实现这一点,它真的有必要吗? 在客户端,我想要类似的东西:

//pagina.js
Template.pagina.helpers{
    userHasItem: return Session.get('userHasItem');
}
//pagina.js

Meteor.call('userHasItem', Meteor.userId(), function (error,result) {

    Session.set('userHasItem', result);
});

//在服务器端:

if(Meteor.isServer){

    Meteor.startup(function () {

        var userHasItemAsync = function (userId) {
            setTimeout(function () {
                if (Items.findOne({'userId': userId})) {
                    return true;
                } else {
                    return false;
                }
            }, 4000);
        };


    Meteor.methods({


        userHasItem: function(userId) {

            var userHasItemSync = Meteor.wrapAsync(userHasItemAsync),
                result;
            try {
                userHasItemSync(userId);

                console.log(result);
                return result;
            }catch (e) {
                console.log('erreur', e.message);
                throw new Meteor.Error(500, e);
            }

        },

    }
    });
}

2 个答案:

答案 0 :(得分:0)

无法根据现有代码重现错误。

仍然,userHasItemAsync不可用,因为您已在Meteor.startup函数中本地定义它。但在这种情况下你应该得到的错误是userHasItemAsync is undefined

此处输入的代码也有多处错误(我猜您在未从项目中复制/粘贴时输入):模板而非模板,模板在isClient之外定义(可能是& #39; s在一个可供客户使用的文件中)等等。因此,很难重现您的确切案例。

答案 1 :(得分:0)

无需调用服务器方法来查看该项是否存在(假设您已设置正确的发布/订阅),也无需调用wrapAsync。事实上,你想要实现的目标甚至不需要会话。所有代码都可以最终提炼到:

Template.pagina.helpers{
    userHasItem: return Items.find({ userId: Meteor.userId() }).count() > 0;
}

Items.find返回的游标本身就是反应性的,因此不需要使用Session。