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

Good way to prevent spamming async calls

本文关键字:调用 方法 异步      更新时间:2023-09-26

我正面临一个问题,我认为我找到了一个有效的解决方案。但为了万无一有,我愿意面对公众的批评。

我有一个可以触发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/

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

我做得对吗?

这有什么设计模式吗?

如果我做错了,什么是错的?

我该如何改进它?

我错过什么了吗?

你知道我…我总是错过一些东西:(

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

-* 我确信这是一种真实的疾病,它必须是,它是真实的,我已经看到了!

对于事件减少,您正在谈论的是脱缆。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,如果没有,则应该安全地忽略它们。