Meteor方法在客户端返回null,在客户端上运行的同样方法返回正确的值

时间:2015-04-10 01:57:42

标签: javascript meteor

我得到了预期的行为,但我很困惑为什么......

我有这个Meteor方法,它返回文档密钥的值;日志语句证明了这一点:

findUserEmail: function(user_id){
    var user = Meteor.users.find({_id: user_id}).fetch();
    console.log(user[0].emails[0].address);
    return user[0].emails[0].address;
}

但是当我在客户端上调用它时,shared_user_email字段为null

shared_user_email: Meteor.call('findUserEmail', $(ev.target).find('[name=shared_user]').val())

但是,当我模拟通过模仿客户端上的服务器查询调用Meteor方法时,它返回上面Meteor方法记录的值:

shared_user_email: Meteor.users.find({_id: $(ev.target).find('[name=shared_user]').val()}).fetch()[0].emails[0].address

当客户端尝试调用服务器方法时,转换中丢失了什么?

修改

当我使用Meteor方法将文档插入到我的集合中时会发生什么,其字段依赖于Meteor方法?我一直在undefined字段获取shared_user_email

var newList = {
        title: $(ev.target).find('[name=title]').val(),
        description: $(ev.target).find('[name=description]').val(),
        dateCreated: today.toDateString(),
        owner: Meteor.userId(),
        owner_email: Meteor.users.find({_id: Meteor.userId()}).fetch()[0].emails[0].address,
        shared_user: $(ev.target).find('[name=shared_user]').val(),
        shared_user_email: Meteor.call('find_shared_user_email', 
            $(ev.target).find('[name=shared_user]').val(),
             function(err, user_email){
                return user_email;
            })
    }

    Meteor.call('addList', newList, function(err, list){
        return list;
    });

2 个答案:

答案 0 :(得分:1)

在客户端上,您需要调用Meteor.call()的回调函数来从方法中检索值。

来自documentation

  

在客户端上,如果你没有通过回调而你不在   存根,调用将返回undefined,你将无法得到   返回方法的值。那是因为客户没有   纤维,所以它实际上没有任何方法可以阻挡遥控器   执行方法。

它应该如下工作:

Meteor.call(
  'findUserEmail',
  user_id,
  function(error, result){
    // 'result' here is email address from method
  }
);

答案 1 :(得分:1)

上面的代码不起作用,因为你还没有从第一个服务器调用中获得异步响应:

var newList = {
    /* some code */
    shared_user_email: Meteor.call('find_shared_user_email', 
        $(ev.target).find('[name=shared_user]').val(),
         function(err, user_email){
            /* this code is executing asynchronous */
            return user_email;
        })
}

/* the following call won't wait for the previous server call's completion */
Meteor.call('addList', newList, function(err, list){
    return list;
});

相反,只有当您确定第一个电话已完成时,您才必须拨打第二个电话,例如:

var newList = {
    /* some code */
};

Meteor.call('find_shared_user_email', 
    $(ev.target).find('[name=shared_user]').val(),
     function(err, user_email){
        newList.shared_user_email = user_email;
        Meteor.call('addList', newList, function(err, list){
            /* other code to handle the added list */
        });
    })
}