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

Javascript 防止垃圾邮件异步调用的好方法,javascript,ajax,Javascript,Ajax,我面临一个问题,我想我找到了一个有效的解决办法。 但为了确定我想面对公众的批评 我有一个可以触发ajax调用的小应用程序 这些电话可能需要时间才能回复 我最不喜欢的一件事是,当用户多次点击时,会发送大量请求,而结果会以最快的速度和平返回 我也不想知道我的用户(只要他变得明智并治愈了严重的普遍性clickoïdosis*病例)没有得到他调用的最后一个操作的结果 因此,为了避免这种情况,我认为我可以: 告诉我的函数注意它是否已经被调用并且正在等待响应 如果是,则它存储对它进行的任何其他调用,并

我面临一个问题,我想我找到了一个有效的解决办法。 但为了确定我想面对公众的批评

我有一个可以触发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();
}
为了澄清所有这一切,我制作了一个工作的JSFIDLE,它应该是不言自明的:

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

我做对了吗

这有设计模式吗

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

我怎样才能改进它

我错过什么了吗

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

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


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

对于事件减少,您谈论的是去抖动。有一个jquery去抖动方法,并且有自己的实现

问题的第二部分是典型的自动完成-在一般搜索中,用户首先键入的字符较少,导致较大且通常较慢的响应。当用户键入更多信息时,查询会较长,但随着搜索查询返回的匹配项较少且负载较小,响应会更快。软件模式at需要确保最后的最新响应是相关标识符模式(163),我认为最好在这里介绍:-参见幻灯片45


如果这看起来太棘手,则将最后一个请求和相关的(消息)id存储到回调处理程序中,可以使用javascript,也可以从服务器回显,这非常适合映射一对一请求。如果有任何请求返回,请检查它们是否具有最新的(消息)id,如果没有,则应该安全地忽略它们。

更简单的解决方案:禁用可单击元素,直到AJAX请求返回或超时。这是我考虑过的解决方案,但很难实现(出于各种原因,其中之一是我的函数不知道谁会调用她)在我的情况下。但我当然可以,我会优先考虑这个问题。这个问题似乎更适合我。我没有想到它,你是对的。我应该在这里关闭它,然后在那里重新打开它吗?也许这是一种优雅的方法,可以避免对服务器产生太多“垃圾邮件”流量,但它解决了一个如果你只提供提要就不会存在的问题回到用户。老实说,如果我点击了某个东西而某个东西没有发生,我会感到沮丧,并认为某个东西坏了。按照MikeW说的去做,不要疏远你的用户。先生,你给了我我想要的东西。一个清晰的、非评判性的解释,包括模式和东西。