#javascript #meteor #meteor-blaze #ddp
#javascript #meteor #meteor-blaze #ddp
Вопрос:
У меня очень интересная проблема в моем приложении Meteor js: когда я вызываю метод meteor внутри метода onCreated моего шаблона, обратный вызов для этого метода иногда возвращается немедленно с неопределенным результатом. Оказывается, это связано с тем, что шаблон был создан в результате запуска моделирования метода meteor.
Два вопроса:
- Это ошибка? Это, конечно, не то поведение, которое я ожидал.
- Как я могу обойти это, не используя странные хаки, такие как setTimeout (и, кстати
Meteor.setTimeout
, не допускается внутри моделирования метода)?
Некоторый код:
// My Template (Not my real code, just to demonstrate)
Template.saying.onCreated(() => {
var tmpl = Template.instance();
tmpl.saying = new ReactiveVar();
Meteor.call('getSaying', (err, saying) => {
// If called inside of a simulation, saying is null
tmpl.saying.set(saying);
});
});
// Assume that the above template is used in an {{each}} block
// and somewhere in my code I call this
Items.insert({});
// Because Items.insert wraps a meteor method which also runs as a
// simulation on the client, then the Template.saying.onCreated
// callback will be called in the context of an active simulation,
// which means that 'getSaying' method call will return immediately
// with undefined as the result.
Комментарии:
1. Это похоже на довольно неэффективный шаблон — вы будете вызывать сервер один раз / шаблон в цикле всякий раз, когда отображается родительский шаблон, просто чтобы установить некоторую реактивную переменную. Даже если вы сделаете эту работу, она будет медленной. Почему бы не поместить данные, которые вы получаете с сервера, в коллекцию и позволить Meteor отправить их клиенту?
2. К сожалению, это шаблон, который я должен использовать, каждому шаблону нужен свой собственный токен, и эти токены должны генерироваться на лету.
Ответ №1:
Две возможности избежать моделирования:
- Определите метод только в файле на стороне сервера
- Используйте isClient. При запуске моделирования оно будет оценено как true
if (Meteor.isClient) { // on the client, the return value of a stub is ignored return; }
Комментарии:
1. На самом деле это не работает по двум причинам: 1. Поведение, которое я получаю, связано с методом, определенным только на стороне сервера (однако внешний метод определяется как на стороне клиента, так и на стороне сервера и должен быть таким). 2. Проблема в том, что в данных обстоятельствах (внутри моделирования) возвращаемое значение не игнорируется, но я хочу, чтобы оно было.
2. Ну, я не понимаю, как значение не игнорируется в приведенном выше коде. Почему вы в этом уверены? Если это симуляция, то условие наверняка будет оценено как true
3. Проблема в том, что неопределенное возвращаемое значение, как в вашем примере выше, будет передано в обратный вызов метода meteor, если метод meteor был вызван внутри моделирования метода meteor.