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

时间:2013-11-26 18:18:50

标签: javascript ajax google-chrome xmlhttprequest soundcloud

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打开一个类似的问题。

1 个答案:

答案 0 :(得分:1)