Javascript 调用Meteor.Call()并在`before:insert`hook'内等待

Javascript 调用Meteor.Call()并在`before:insert`hook'内等待,javascript,meteor,ecmascript-6,synchronous,meteor-autoform,Javascript,Meteor,Ecmascript 6,Synchronous,Meteor Autoform,场景: 我试图仅在日期不冲突的情况下使用autoform为客户插入约会。下面是获得简要想法的代码 {{#autoForm id='insertAppointmentForm' collection=appointment type="insert" doc=this validation="browser"}} <fieldset> <!-- All fields here --> </fieldset>

场景:

我试图仅在日期不冲突的情况下使用
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}} 
问题:


这里的问题是,即使从
Meteor.call()
返回
error
并将
文档插入数据库,表单也会被提交。我知道Meteor.call()
是异步调用,但是我怎么能等待结果呢?只有在没有错误的情况下,我才想继续提交。

钩子可以异步工作。从:

如果需要,这些函数可以执行异步任务。如果不需要异步,只需返回文档或修改器,或返回
false
以取消提交。如果没有返回任何内容,则最终必须调用
this.result()
并将文档或修改器传递给它,或
false
以取消提交

因此,代码可以如下所示:

插入:函数(doc){
//注意使用()=>{}绑定`this`上下文
Meteor.call('CheckAppointClash',doc,(错误,响应)=>{
如果(错误){
这个结果(假);
}否则{
该结果(doc);
}
});
//一无所获
}
尽管如此,我还是建议你重新考虑你的流程。在钩子上检查“碰撞”是错误的。您应该在“用户输入的数据”步骤中执行此操作,并相应地禁用/启用“提交”按钮。

检查“用户输入的数据”上的冲突在性能方面不是一个可行的解决方案(即使我使用
..debounce
来控制请求)。在钩子上检查它只需向服务器调用一次,它符合我的应用程序需要。@AnkurSoni我的意思不是“连续检查”,只要在用户已经在字段中输入数据时检查一次。当然,如果您需要所有字段来检查冲突,那么这将毫无意义:)
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);