Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 卸载时同步跨域ajax删除请求_Javascript_Jquery_Ajax_Browser - Fatal编程技术网

Javascript 卸载时同步跨域ajax删除请求

Javascript 卸载时同步跨域ajax删除请求,javascript,jquery,ajax,browser,Javascript,Jquery,Ajax,Browser,我正在使用需要锁定的跨域远程资源。正确设置CORs标头 我试图解决当浏览器窗口关闭时,客户端未释放资源(在锁定过期之前保持锁定)的情况 我曾希望在窗口卸载时发送一个同步删除请求。我正在使用jquery(如果有必要,答案可以是纯javascript…提到上下文的jquery),注意到他们的文档说“跨域请求…不支持同步操作”,我变得非常难过 是否可以发出同步的跨域ajax请求?jquery的限制是由旧浏览器造成的吗?我读到的所有内容都表明,如果ajax调用是异步的,卸载事件侦听器将没有足够长的时间来

我正在使用需要锁定的跨域远程资源。正确设置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请求。这是由于:异步:!同步,为什么不总是使用异步?同步可以挂起浏览器,直到给出响应。。。