Как запускать код вне моделирования метода meteor

#javascript #meteor #meteor-blaze #ddp

#javascript #meteor #meteor-blaze #ddp

Вопрос:

У меня очень интересная проблема в моем приложении Meteor js: когда я вызываю метод meteor внутри метода onCreated моего шаблона, обратный вызов для этого метода иногда возвращается немедленно с неопределенным результатом. Оказывается, это связано с тем, что шаблон был создан в результате запуска моделирования метода meteor.

Два вопроса:

  1. Это ошибка? Это, конечно, не то поведение, которое я ожидал.
  2. Как я могу обойти это, не используя странные хаки, такие как 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:

Две возможности избежать моделирования:

  1. Определите метод только в файле на стороне сервера
  2. Используйте 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.