使用coffeescript延迟(去抖)ajax请求

时间:2012-12-22 05:42:33

标签: javascript ruby-on-rails coffeescript

我在我的rails应用程序中使用CoffeeScript,我需要延迟远程ajax表单提交,我遇到的主要问题是对请求进行去抖动,以便表单将在没有用户输入的情况下发送250ms形式。

现在我有一些看起来像是这样的东西,显然它不会工作所以它有一些调试输出来帮助我。

看一下下表,您应该知道我想要“去抖”的功能在element.keyup (event) ->功能范围内,任何帮助都会很棒!

remoteTable =

  bindEvents: (element) ->
    element.keyup (event) ->
      console.log(event)


  send: (event) ->
    console.log(event)

**如果我能收集一些如何运作的例子,那将会非常有帮助吗? **我确实看到了underscore.js的方式,但是 在这里,这是我的旧方法:我无法解决这个问题:

http://davidwalsh.name/function-debounce

2 个答案:

答案 0 :(得分:1)

我在coffeescript.org上玩,他们有一个在线“尝试coffeescript”翻译/跑步者似乎

remoteTableOrg =
  bindEvents: (element) ->
    element.keyup (event) ->
      console.log(event)
  send: (event) ->
    console.log(event)

转换为

var remoteTableOrg;

remoteTableOrg = {
  bindEvents: function(element) {
    return element.keyup(function(event) {
      return console.log(event);
    });
  },
  send: function(event) {
    return console.log(event);
  }
};

所以element.keyup实际上是一个函数作为参数的函数调用。

看到这个,我试过了

remoteTable =
  bindEvents: (element) ->
    element.keyup _.debounce((event) ->
      console.log(event)
    ,250)
  send: (event) ->
    console.log(event)

得到了:

var remoteTable;

remoteTable = {
  bindEvents: function(element) {
    return element.keyup(_.debounce(function(event) {
      return console.log(event);
    }, 250));
  },
  send: function(event) {
    return console.log(event);
  }
};

我没有尝试过任何事情,但我不知道为什么这不起作用。我不得不承认没有用coffeescript做太多事情,但看起来很简单。

答案 1 :(得分:1)

你可以使用简单的超时,不需要花哨。

remoteTable =
  bindEvents: (element) ->
    timeout = null
    element.keyup (event) ->
      clearTimeout(timeout)
      timeout = setTimeout(remoteTable.send, 250)

  send: ->
    console.log('Sending request...')