调用Meteor.call()并在`before:insert`钩子里面等待

时间:2017-10-10 10:07:39

标签: javascript meteor ecmascript-6 synchronous meteor-autoform

情境:

我正在尝试仅在日期不冲突时使用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}} 

我正在添加以上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()是异步调用,但我怎么能等待结果呢?只有这样我才能继续提交,如果没有错误。

1 个答案:

答案 0 :(得分:2)

挂钩可以异步工作。来自documentation

  

如有必要,这些功能可以执行异步任务。如果不需要异步,只需返回文档或修饰符,或返回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
}

虽然,我建议你重新考虑一下你的流程。检查钩子中的“碰撞”是错误的。您应该在“用户输入的数据”步骤中执行此操作,并相应地禁用/启用“提交”按钮。