【问题标题】:Delay (debounce) ajax request with coffeescript使用咖啡脚本延迟(去抖动)ajax 请求
【发布时间】:2012-12-22 05:42:32
【问题描述】:

我在我的 Rails 应用程序中使用 CoffeeScript,我需要延迟远程 ajax 表单提交,我遇到的主要问题是取消请求,以便在 250 毫秒过去后发送表单而无需用户输入表格。

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

看看下表,你应该知道我要“去抖动”的函数在element.keyup (event) ->函数内,任何帮助都会很神奇!

remoteTable =

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


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

** 如果我能收集几个例子来说明它是如何工作的,那会很有帮助吗? ** 我确实看到了 underscore.js 的做法,但是 在这里,这是我的旧方法:我只是想不通这应该怎么做:

http://davidwalsh.name/function-debounce

【问题讨论】:

    标签: javascript ruby-on-rails coffeescript


    【解决方案1】:

    您可以为此使用简单的超时,无需花哨。

    remoteTable =
      bindEvents: (element) ->
        timeout = null
        element.keyup (event) ->
          clearTimeout(timeout)
          timeout = setTimeout(remoteTable.send, 250)
    
      send: ->
        console.log('Sending request...')
    

    【讨论】:

      【解决方案2】:

      我在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);
        }
      };
      

      我什么都没试过,但我不知道为什么这不起作用。我不得不承认,我对咖啡脚本做的不多,但它看起来很简单。

      【讨论】: