同步XHR弃用

时间:2015-03-26 15:43:58

标签: javascript ajax asynchronous synchronous

根据xhr specs async: false已弃用,现代用户代理应该开始警告甚至抛出异常。

  

工作人员之外的同步XMLHttpRequest正在从Web平台中删除,因为它会对最终用户的体验产生不利影响。 (这是一个需要很多年的漫长过程。)当JavaScript全局环境是文档环境时,开发人员不得为async参数传递false。强烈建议用户代理在开发人员工具中警告这种用法,并尝试在发生时抛出InvalidAccessError异常。

我理解并赞同有关“有害”影响的论点。关于此弃用的要点是您可以使用异步XHR解决任何任务。但是,我可以在浏览器中看到至少两个同步XHR的应用程序:

1)window.onbeforeunload。任何异步xhr在这里都没用,因为浏览器选项卡会立即关闭。使用示例onbeforeunload事件中的XHR是文档“lock”。用户在新标签中打开文档,文档现在被他锁定。每个人都可以以只读方式查看此文档。然后用户关闭选项卡,文档应解锁。我没有看到任何带有异步请求的解决方案,直到用户代理保证将执行异步请求,并且在选项卡关闭后不会中止。

2)点击锚点上的事件(<a>标签)。它接近以前的情况,因为它也关闭当前窗口,在同一个选项卡中创建新窗口。假设我只想跟踪页面上关键链接的点击(但我相信这个事件同步使用有更多高尚的例子)。一种解决方法是在处理程序中执行e.preventDefault(),然后手动分配位置,但这会破坏鼠标中键的行为(强制打开新选项卡)。

问题是: 1)即使选项卡已关闭,用户代理是否必须才能完成异步XHR? 2)我的例子有更多智能解决方案吗?

1 个答案:

答案 0 :(得分:1)

对于保证在页面卸载之前发送HTTP数据的特定情况,请查看实验Beacon API。 MDN甚至有specific article讨论这个用例。

它是一个异步API,但它保证即使在页面卸载后也会发送通过它发送的任何数据。