gpt4 book ai didi

javascript - 卸载时同步跨域ajax DELETE请求

转载 作者:行者123 更新时间:2023-11-30 16:37:37 25 4
gpt4 key购买 nike

我正在处理需要锁定的跨域远程资源。 COR header 已适当设置。

我正在尝试解决当浏览器窗口关闭时资源没有被客户端释放(保持锁定直到锁过期)的情况。

我曾希望在窗口卸载时发送一个同步的 DELETE 请求。我正在使用 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 分钟或更长时间,它也会解锁。

网络套接字

这将在客户端和服务器之间创建一个开放的连接,当这个连接打开时,您可以保持资源锁定。一旦客户端断开连接,您可以假设客户端已关闭页面并将其解锁。这里的缺点是如果客户端失去网络连接,它也会解锁。

关于javascript - 卸载时同步跨域ajax DELETE请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32486978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com