Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Вызовите Meteor.call() и подождите внутри хука `before: insert`

Автор вопроса: Ankur SoniОтветов: 1

Сценарий:

Я пытаюсь вставить Appointment для клиента, использующего autoform, только когда даты не конфликтуют. ниже приведен код для получения краткой идеи.

{{#autoForm id='insertAppointmentForm' collection=appointment type="insert"
              doc=this validation="browser"}}
    <fieldset>
      <!-- All fields here -->
    </fieldset>
    <button type="submit" class="btnn"> Create </button>
{{/autoForm}}

Я добавляю хук к приведенному выше коду автоформы insert, как показано ниже,

var hooksObject = {
  before: {
    insert: function(doc) {
      console.log(doc);
      Meteor.call('checkAppointmentClash', doc, function(error, response){
          if(error){ } else { }
      });
      return doc; // I want to wait here
    }
  },
  onSuccess: function(formType, result) {},
  onError: function(formType, error) {}
};

AutoForm.addHooks(['insertAppointmentForm'], hooksObject, true);

Проблема:

Проблема здесь в том, что форма отправляется, даже если error возвращается из Meteor.call() и вставляет document в базу данных. Я знаю, что Meteor.call() это асинхронный вызов, но как мне дождаться результата? только тогда я хочу продолжить отправку, если нет ошибки.

javascriptmeteorecmascript-6synchronousmeteor-autoform

Ответы

Ответ 1 · рейтинг 2 · Styx

Хуки могут работать асинхронно. Из документации:

Эти функции могут выполнять асинхронные задачи, если это необходимо. Если асинхронность не нужна, просто верните документ или модификатор или верните false, чтобы отменить отправку. Если вы ничего не возвращаете, вы должны в конце концов вызвать this.result() и передать ему либо документ, либо модификатор, либо false, чтобы отменить отправку.

Таким образом, код может выглядеть так:

insert: function(doc) {
  // note using () => {} to bind `this` context
  Meteor.call('checkAppointmentClash', doc, (error, response) => {
    if(error) {
      this.result(false);
    } else {
      this.result(doc);
    }
  });
  // return nothing
}

Хотя я бы посоветовал вам переосмыслить свой поток. Неправильно проверять "конфликт" в хуке. Вы должны сделать это на шаге "введенные пользователем данные" и соответственно отключить/включить кнопку "Отправить".

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы