Javascript 卸载时同步跨域ajax删除请求
我正在使用需要锁定的跨域远程资源。正确设置CORs标头 我试图解决当浏览器窗口关闭时,客户端未释放资源(在锁定过期之前保持锁定)的情况 我曾希望在窗口卸载时发送一个同步删除请求。我正在使用jquery(如果有必要,答案可以是纯javascript…提到上下文的jquery),注意到他们的文档说“跨域请求…不支持同步操作”,我变得非常难过 是否可以发出同步的跨域ajax请求?jquery的限制是由旧浏览器造成的吗?我读到的所有内容都表明,如果ajax调用是异步的,卸载事件侦听器将没有足够长的时间来完成,并建议使用同步请求进行此类清理。不幸的是,呼叫是跨域的。。。我能做什么Javascript 卸载时同步跨域ajax删除请求,javascript,jquery,ajax,browser,Javascript,Jquery,Ajax,Browser,我正在使用需要锁定的跨域远程资源。正确设置CORs标头 我试图解决当浏览器窗口关闭时,客户端未释放资源(在锁定过期之前保持锁定)的情况 我曾希望在窗口卸载时发送一个同步删除请求。我正在使用jquery(如果有必要,答案可以是纯javascript…提到上下文的jquery),注意到他们的文档说“跨域请求…不支持同步操作”,我变得非常难过 是否可以发出同步的跨域ajax请求?jquery的限制是由旧浏览器造成的吗?我读到的所有内容都表明,如果ajax调用是异步的,卸载事件侦听器将没有足够长的时间来
编辑
因此,我很好奇我是否在本地开发过程中幸运(即127.0.0.1:8080上的客户端和127.0.0.1:8081上的api),或者jquery文档只是误导。接下来的事情会不会给我带来麻烦 这似乎在Chrome45中起作用:
var unload_event = "unload." + lock.id
function release_lock(sync) {
$.ajax({
method: "DELETE",
async: !sync,
data: lock,
url: lock.url,
error: function(){
console.log("failed to release lock " + JSON.stringify(lock));
},
success: function(){
console.log("lock " + lock.id + " released");
lock = null;
$(window).off(unload_event);
}
});
}
$(window).on(unload_event, function(){
release_lock(true);
});
它会在控制台中生成以下警告:
Synchronous XMLHttpRequest on the main thread is deprecated because of
its detrimental effects to the end user's experience.
For more help, check http://xhr.spec.whatwg.org/.
我将避免在卸载事件中执行此操作,因为同步ajax是唯一可行的方法,并且在一些现代浏览器中不推荐使用同步ajax请求 备选方案包括: 保留请求 这将涉及定期向服务器发送请求,指示用户仍在编辑资源。这种技术的缺点是,在超时发生之前,资源将保持锁定状态,因此,如果您将keepalive设置为1分钟的间隔和3分钟的锁定超时,则在用户离开页面后,它将保持锁定状态长达3分钟。此外,如果用户失去网络连接3分钟或更长时间,它也将被解锁 网袋
这将在客户机和服务器之间创建一个打开的连接,当此连接打开时,您可以保持资源锁定。一旦客户端断开连接,您就可以假定客户端已关闭页面并将其解锁。这里的缺点是,如果客户端失去网络连接,它也将被解锁。通过卸载事件以外的其他方式处理锁定,例如keepalive轮询和超时;如果在特定时间段内未发出keepalive请求,则假定客户端已关闭页面并将其解锁。@KevinB我已经这样做了,但我希望它们立即可用,而不是等待锁过期。将用评论更新原始帖子。我可能只是在chrome上运气不错,但它似乎允许这个请求。如果后端支持,WebSocket将是另一个选择。卸载时的同步请求让我感觉很不舒服。至于jquery文档中关于同步和跨域的内容,我会忽略这一点,因为对XmlHttpRequest文档没有这样的限制。当然,一般情况下,同步请求是不推荐的。该注释可能是由于某些旧浏览器不支持同步CORS请求。这是由于:异步:!同步,为什么不总是使用异步?同步可以挂起浏览器,直到给出响应。。。