我得到了预期的行为,但我很困惑为什么......
我有这个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;
});
答案 0 :(得分:1)
在客户端上,您需要调用Meteor.call()
的回调函数来从方法中检索值。
在客户端上,如果你没有通过回调而你不在 存根,调用将返回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 */
});
})
}