如果在超时

时间:2015-08-13 11:43:22

标签: javascript meteor underscore.js

我有一个meteor事件,它监视一组字段以进行更改,并相应地更新数据库。为了提高效率(如果被误导,请纠正我)我为事件添加了一个油门,这样它最多只会每秒一次。

事件:

Template.TheForm.events({
  "input #TheForm .field": _.throttle(function (event) {
    // Update field
    Meteor.call("updateForm", this._id, event.target.name, event.target.value, function(error, result){
      // Do someting here
    });
  }, 1000) // Throttle to fire at most once every second
});

形式:

<form id="TheForm">
  <fieldset id="person">
    <legend>The person</legend>
    <label for="name">Name</label>
    <input id="name" type="text" name="name" class="field" value="{{ name }}" />
    <label for="email">Email</label>
    <input id="email" type="email" name="email" class="field" value="{{ email }}" />
  </fieldset>
</form>

问题在于,如果我填充一个字段并在1000毫秒超时内模糊,只有第一个字符似乎被拾取,即

'Nathan'快速输入name字段并模糊到email字段,看到数据库中的值返回为'N'。

我的理解是._throttle函数将获取字段值的最终结果 - 即使它意味着在1秒后收集它。

来自docs

  

默认情况下,只要您调用它,throttle就会执行该功能   这是第一次,如果你再次多次调用它   在等待期间,一旦这段时间结束。如果你愿意的话   要禁用前沿呼叫,请传递{leading:false},如果你是   喜欢在尾端禁用执行,传递{trailing:   假}。

主导逻辑似乎工作正常,因此最初的'N',但我不是在调用trailing: false,所以除非我误解了最终值,否则应该总是收集。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您的两个字段都使用相同的事件处理程序,因此如果第二个字段在1秒内触发事件,则会抑制第一个字段中的某些事件。如果您在1秒内在name字段中输入“Nathan”,则会在name=N之后调用您的处理程序,然后在{1}}之后调用1秒。但是如果切换到name=Nathan字段并在那里输入一些字符(比如说“nathan @ e”),那么这些事件将导致email事件被抑制。在这种情况下,您将立即获得name=Nathan并在1秒后获得name=N

因此,解决方案是为每个输入字段设置一个单独的限制事件处理程序。您不必多次复制粘贴事件处理程序 - 您可以使用这样的方法:

email=nathan@e