代码之家  ›  专栏  ›  技术社区  ›  Ankur Soni

呼叫Meteor。call()并在“之前”内等待:insert“hook”

  •  2
  • Ankur Soni  · 技术社区  · 7 年前

    脚本:

    我正在尝试插入一个 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 到数据库。我知道 是异步调用,但如何等待结果?只有这样,如果没有错误,我才想继续提交。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Styx    7 年前

    钩子可以异步工作。从 documentation :

    必要时,这些函数可以执行异步任务。如果不需要异步,只需返回文档或修改器,或返回 false 取消提交。如果你不归还任何东西,那么你必须打电话 this.result() 取消提交。

    所以代码可以如下所示:

    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
    }
    

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