我有这个功能来解锁用户当前正在编辑的列表:
function unsetLock(id) {
$.ajax({
type: "POST",
url: "/ajax.php?action=unsetLock",
dataType: 'json',
data: "id="+ id
});
return true;
}
当用户离开列表时,我必须取消锁定:
unsetLock(lockID);
document.location.href='/page/to/navigate/back/to.php';
然而,这种解锁有时会起作用,有时却不起作用。我认为这是因为在实际将ajax调用发送到服务器之前执行了document.location.href
。
如何在将用户导航到下一页之前强制发送解锁?
实际上我不需要等待Ajax-Reply,因为我想重定向用户,无论是否成功。我只是想确保它被转移到服务器。
如果我将document.location.href
放在Ajax函数中,它将等待回复。
答案 0 :(得分:7)
一种非常糟糕的方法是添加:async: false
,它将锁定浏览器直到AJAX调用完成。
当然,如果出现问题并且AJAX调用从不完成......
这是解决问题的最快捷,最简单的解决方案,但可能不是最好的。
我个人来说,锁只会持续20秒(使用数据库中的时间戳),并且每隔十秒发送一次ajax调用以使用{{1}重新锁定页面(如果这是有意义的话) }。 这样,在有人离开页面几秒钟后,锁就会自动解锁,无论情况如何(例如,客户端的电源故障都不会让页面永久锁定)。
答案 1 :(得分:4)
也许我错过了什么,但为什么不在Ajax调用中使用success
选项?这将执行任何结果并确保它到达服务器。
function unsetLock(id) {
$.ajax({
type: "POST",
url: "/ajax.php?action=unsetLock",
dataType: 'json',
data: "id="+ id,
success: function(){
document.location.href='/page/to/navigate/back/to.php';
}
});
return true;
}