я получил намеченное поведение, но Im путать почему ...метод Метеор возвращает нуль на клиенте, тот же метод запуск на клиенте возвращает правильное значение
У меня есть этот метод Метеора, который возвращает значение ключа документа; утверждение журнала доказывает, например:
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())
НО, когда я имитировать вызов метода Метеор имитируя сервера запрос на клиенте, он возвращает значение, которое метод Метеор выше бревна:
shared_user_email: Meteor.users.find({_id: $(ev.target).find('[name=shared_user]').val()}).fetch()[0].emails[0].address
Что утеряно при переводе, когда клиент пытается вызвать метод сервера?
EDIT
Что происходит, когда я использую метод Метеора, чтобы вставить документ в мою коллекцию, поле которого опирается на методе Метеора? Я получаю 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;
});
im запутался в интуиции за волокном, если вы можете сэкономить минуту – redress
Вот хорошее введение в Fibers в Meteor and Node от одного из лучших авторов с открытым исходным кодом от Meteor: https://meteorhacks.com/fibers-eventloop- и-meteor.html. Основная идея re: ваш вопрос в том, что когда вы вызываете Meteor.call() от клиента, вам нужно ждать возвращения результата. Но это не всегда сразу, а остальная часть вашего кода будет продолжать выполняться. Поэтому вам нужно вызвать функцию обратного вызова, чтобы дождаться результата. –
gotcha, спасибо большое – redress