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

Сценарий:

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


person Ankur Soni    schedule 10.10.2017    source источник


Ответы (1)


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

Эти функции могут выполнять асинхронные задачи, если это необходимо. Если асинхронность не нужна, просто верните документ или модификатор или верните 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
}

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

person Styx    schedule 10.10.2017
comment
проверка коллизии введенных пользователем данных не является возможным решением с точки зрения производительности (даже если я использую _.debounce для управления запросами). Проверка на крючке делает всего один вызов на сервер, и это соответствует потребностям моего приложения. - person Ankur Soni; 10.10.2017
comment
@AnkurSoni Я не имел в виду проверку постоянно, только один раз, когда пользователь уже ввел данные в поле. Конечно, это было бы бессмысленно, если вам нужны все поля для проверки на конфликты :) - person Styx; 10.10.2017