2014-06-09 33 views
1

我面临一个问题,并认为我找到了一个工作解决方案。但是,我只是想向公众批评者反驳。防止垃圾邮件异步呼叫的好方法

我有一个小的应用程序,可以触发ajax调用。

这些电话可能需要一段时间才能恢复。

  • 有一件我讨厌的事情是,有一种情况,点击多次的用户会发送大量的请求,而结果会以尽可能快的速度平稳回来。
  • 我也不想知道我的用户(只要他明智,并且治愈了他严重的广泛的clickoïdosis*案件)不会得到他所称的最后一个动作的结果。

所以为了避免这种情况,我以为我可以:

  • 告诉我的功能要知道是否它已经被称为,正在等待答复。
  • 如果是,那么它存储任何其他的调用,并返回什么都不做。
    • 任何进一步的呼叫都会压缩存储的呼叫,因为我只想保留一个呼叫(最后一个呼叫)。
  • 当执行回调时,它会检查一个呼叫是否挂起。
    • 如果没有呼叫等待,然后它会作为它应该
    • 如果一个呼叫待它跳过这是正常行为,只是调用触发与结算,存储未决变量的未决集合数据的Ajax调用的方法呼吁

这里是我的代码:

function bob(i) { 

    var me = this; 
    if (this.isFetching === undefined) { 
     this.isFetching = false; 
    } 
    if (this.isFetching) { 
     this.nextFetch = i; 
     return; 
    } else { 
     this.isFetching = true; 
    } 
    yourFavoriteAjaxCallerMethod({ 
     url: 'http://this_server_does_not_exist.net/this.is?an=example', 
     data: { 
      json: JSON.encode({ 
       bob: i 
      }), 
      delay: 2 
     }, 
     onSuccess: function (response) { 
      console.log(response.bob); 
      me.isFetching = false; 
      if (me.nextFetch !== undefined) { 
       var nextFetch = me.nextFetch; 
       delete me.nextFetch; 
       bob(nextFetch); 
       return; 
      } 
      alert(response.bob); 
     } 
    }).send(); 
} 

为了澄清这一切,我做了一个工作的jsfiddle应该是自explan足够atory:http://jsfiddle.net/LhermitteG/L8kqa/

到目前为止,一切运作良好,这是罚款和花花公子,但我的问题是:

难道我这样做的权利?

有没有关于此的设计模式?

如果我做错了,有什么不好?

我该如何改进?

我错过了什么吗?

你知道我是......我一直想念的东西:(

是的,我知道我有,我应该解决的不安全感的问题...

- * 我确定这是一种真正的疾病,它必须是真的,我见过它!

+3

更简单的解决方案:禁用可点击元素,直到AJAX请求返回或超时。 –

+0

这是我想到的解决方案,但在我的案例中很难实现(出于各种原因,其中之一是我的功能不知谁可能称她)。但我当然可以,我会首先支持那一个。 – Ar3s

+0

这个问题似乎更适合http://codereview.stackexchange.com –

回答

2

对于事件减少,你在谈论的是去除。 http://benalman.com/projects/jquery-throttle-debounce-plugin/有一个jQuery去抖动方法,并且http://underscorejs.org/#debounce有它自己的实现。

您的问题的第二部分在自动完成中很常见 - 在一般搜索中,用户首先输入的字符较少,导致响应速度较慢,响应速度通常较慢。当他们输入更多信息时,查询时间更长,但响应速度更快,因为搜索查询返回的匹配少且有效负载更小。需要确保最后的响应大多数软件模式是相关标识符模式(163),我相信这里是最好的介绍:http://www.slideshare.net/kevinhakanson/implementing-messaging-patterns-in-java-script-using-the-openajax-hub - 见幻灯片45.

如果这似乎太棘手,采取的最后一个请求并存储将关联(消息)ID添加到JavaScript中的回调处理程序中,或者如果可以从服务器回显它,那么这对于映射一对一请求很理想。如果有任何请求返回,请检查它们是否具有最新(消息)ID,如果不是,应该安全忽略它们。

+0

你先生给了我正是我来的。 一个清晰的,非判断性的模式和东西的解释。 – Ar3s