防止垃圾邮件异步调用的好方法
Good way to prevent spamming async calls
我正面临一个问题,我认为我找到了一个有效的解决方案。但为了万无一有,我愿意面对公众的批评。
我有一个可以触发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,如果没有,则应该安全地忽略它们。
- 未捕获错误:无法在初始化之前调用方法;
- 通过ajax从客户端调用C#方法来执行C#方法
- 如何避免在angular上多次调用方法;s ng重复
- React路由器错误-'无法调用方法'getRouteAtDepth'的未定义'
- 从window.onbeforeunload调用方法背后的代码
- 当输入字段为空时,如何在angular中调用方法
- 函数调用方法有什么用
- 多次调用方法后返回相同promise的模式
- 当从Chrome扩展动态注入JS时,从onload()内部调用方法
- 茉莉花 - 未调用方法
- jQuery如何在原型中调用方法
- ng显示“;调用方法“;不起作用
- Odoo销售点如何访问模型并使用JS调用方法
- 从React调用方法.JS州
- TinyMCE验证给出错误:无法调用方法'getContent'的未定义
- 向模板实例变量传递调用方法调用的结果时出现异常
- 如何在对象中调用方法
- 检查对话框是否为 Open 会引发“初始化前无法在对话框上调用方法”错误
- 在输入类型提交按钮上调用 C# 方法
- 通过类选择器单独调用方法