我在点击按钮时同时执行ajax请求。
我有一个包含警报列表的表,每行都有它自己的按钮,一旦点击就会尝试清除数据库中的警报,然后将其从表中删除。
我可以一个接一个地点击这些按钮并触发ajax请求。
问题:
让我说我点击一个按钮,由于某种原因这需要时间,用户设法点击另一个按钮开始一个新的ajax。
如果当前作用域中的所有ajax请求都已完成,我想在我的ajax succes方法 ONLY 中执行脚本块。
代码:
$(".signAlarm")
.on("click",
function () {
var _this = $(this).parents(".alarmRow");
var alarm = {
Id: $(_this).data("id")
}
$.automation.worker.postJson("/Alarm/SigAlarm",
JSON.stringify({ alarm }),
function (data) {
if (!$.automation.worker.ajaxActive()) {
// execute this if all the sign alarm attempts are finished
}
$(_this).remove();
});
});
ajaxActive功能:
ajaxActive: function() {
if ($.active) return true;
return false;
}
在搜索答案时,我发现jquery.active我在上面的尝试中使用但是当我在成功方法中检查jquery.active时,它是" 1"即使只点击了一次按钮,也不会为0。
我还检查了this post,这让我想到了jquery.active以上,但是$ .ajaxStart和$ .ajaxStopp。
$ .ajaxStart和$ .ajaxStopp的问题,据我所知,它们是全球性的,我希望在签署这些警报时执行特定的代码,并且不希望在每个页面上发生这种情况。制作ajax。
我该如何管理?
答案 0 :(得分:0)
经过大量的思考和在jquery中搜索某种函数的构建后,我决定自己尝试一下。
我想要的是什么:
代码:
全局数组:
ajaxRequests: { value: [] }
在每个ajax请求之前:
$.automation.globals.ajaxRequests.value.push(1);
每次ajax请求后:
clearAjax: function() {
$.automation.globals.ajaxRequests.value.splice(-1, 1);
}
总结一下:
$(".signAlarm")
.on("click",
function () {
var _this = $(this).parents(".alarmRow");
var alarm = {
Id: $(_this).data("id")
}
$.automation.globals.ajaxRequests.value.push(1);
$.automation.worker.postJson("/Alarm/SigAlarm",
JSON.stringify({ alarm }),
function (data) {
$.automation.worker.clearAjax();
if ($.automation.globals.ajaxRequests.value.length === 0) {
// all ajax finished, execute code
}
$(_this).remove();
});
});
答案 1 :(得分:0)
您可以使用deferred objects。
$('.signAlarm').each(function() {
var prom = $.Deferred().resolve();
$(this).click(function() {
var _this = $(this).parents(".alarmRow");
var alarm = {
Id: $(_this).data("id")
};
prom = prom.then(
function () {
return $.post({
'url': '/Alarm/SigAlarm',
'data': JSON.stringify(alarm),
'contentType': 'application/json' // assuming you want the server to think you're sending json
});
}
).done(function () {
if (prom.state() === "resolved") {
// all ajax finished, execute code
}
$(_this).remove();
});
});
});
我不确定$.automation
的用途,但如果您需要,我会编辑我的答案。另外,请注意我如何使用.each()
创建范围,以便单独处理具有类signAlarm
的每个元素。如果您希望共享所有可点击元素的所有调用,则可以创建全局prom
变量。