防止垃圾邮件异步调用的好方法

时间:2014-06-09 21:17:57

标签: javascript ajax

我正面临一个问题,并认为我找到了一个有效的解决方案。 但只是为了确保我愿意面对公众评论家。

我有一个可以触发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:http://jsfiddle.net/LhermitteG/L8kqa/

到目前为止,一切运作良好,这很好,但我的问题是:

  

我做得对吗?

     

有关于此的设计模式吗?

     

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

     

我怎样才能改善它?

     

我错过了什么吗?

     

你知道我...我总是想念一些事情:(

     

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

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

1 个答案:

答案 0 :(得分:2)

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

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

如果这看起来太棘手,请接受最后一个请求,并在javascript中将相关的(消息)id存储到回调处理程序中,或者如果您可以从服务器回显它,这对于映射一对一请求是理想的。如果有任何请求返回,请检查他们是否有最新的(消息)ID,否则应该安全地忽略它们。