javascript – 同步CORS XHR 302重定向失败,但异步工作

Firefox似乎是唯一一个在执行此同步请求时不会抛出错误的浏览器,任何想法为什么?

// Make sure to have your JS console open when you run this
var url = '//api.soundcloud.com/resolve.json?url=http://soundcloud.com/matas/hobnotropic&client_id=83f67039ae0c3790030d256cb9029678';
var xhr = new XMLHttpRequest();
xhr.open('GET', url, false); // SYNCHRONOUS
xhr.onload = alert.bind(null, 'Loaded');
xhr.send(null);

执行几乎相同的异步XMLHttpRequest不会导致错误,并且请求按预期完成:

// Make sure to have your JS console open when you run this
var url = '//api.soundcloud.com/resolve.json?url=http://soundcloud.com/matas/hobnotropic&client_id=83f67039ae0c3790030d256cb9029678';
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true); // ASYNCHRONOUS
xhr.onload = alert.bind(null, 'Loaded');
xhr.send(null);

据我所知:

> SoundCloud API返回正确的CORS头.
> SoundCloud resolve API执行302重定向到http://api.soundcloud.com/tracks/49931.json.
>如果请求是异步执行的,它将成功执行重定向并完成.
>如果请求是同步执行的,那么它将在控制台中出现以下错误(无Firefox)时失败:

> Chrome:“NetworkError:发生网络错误.”
> Opera:“NetworkError:发生网络错误.”
> Safari:“XMLHttpRequest异常101:同步请求中发生网络错误.”

任何人都可以解释为什么同步请求失败?为什么它会因为这样一个奇怪的错误而失败,特别是因为同一个请求在异步执行时有效?为什么这个参数有所作为?这是Firefox或WebKit / Blink人群的已知错误吗?

编辑:我是opened a new issue on Chrome’s bug tracker,因为还没有人能够在规范中指出能够正确解释这种行为的任何内容.当我有机会时,我可能会为WebKit打开一个类似的问题.

解决方法:

这似乎是为了阻止使用同步请求而做出的慎重选择:

> w3网络应用邮件列表:Disable new response types for sync XHR in Window context
> w3 bug:Investigate if synchronous XHR in window context should not support new XHR responseTypes
> Webkit:Synchronous XHR in window context should not support new XHR responseTypes for HTTP(S) requests
> Mozilla:Investigate if synchronous XHR in window context should not support new XHR responseTypes

从我的内容来看,IE似乎从未支持过它.

相关文章

IE6是一个非常老旧的网页浏览器,虽然现在很少人再使用它,但...
PHP中的count()函数是用来计算数组或容器中元素的个数。这个...
使用 AJAX(Asynchronous JavaScript and XML)技术可以在不...
Ajax(Asynchronous JavaScript and XML)是一种用于改进网页...
本文将介绍如何通过AJAX下载Excel文件流。通过AJAX,我们可以...
Ajax是一种用于客户端和服务器之间的异步通信技术。通过Ajax...