Javascript 在OnForeUnload中等待承诺
如果页面关闭,我想发送$http.get。然后我结结巴巴地问了一个问题,Javascript 在OnForeUnload中等待承诺,javascript,angularjs,synchronization,angular-promise,onbeforeunload,Javascript,Angularjs,Synchronization,Angular Promise,Onbeforeunload,如果页面关闭,我想发送$http.get。然后我结结巴巴地问了一个问题, 无法解析承诺,因为如果最后一个方法返回,页面将被破坏 以下操作不起作用,因为onbeforeunload无法解析承诺/未等待承诺: window.onbeforeunload = function( $http.get('http://someth.ing/update-state?page=unloaded').then(function(){ // never called... never s
无法解析承诺,因为如果最后一个方法返回,页面将被破坏 以下操作不起作用,因为onbeforeunload无法解析承诺/未等待承诺:
window.onbeforeunload = function(
$http.get('http://someth.ing/update-state?page=unloaded').then(function(){
// never called... never sent...
}
}
我知道,您可以使用默认的同步HTTP方法,但问题通常是我们如何同步/等待承诺在这里得到解决
我的想法是这样的:
window.onbeforeunload = function(){
var ready = false;
$http.get('http://someth.ing/update-state?page=unloaded').then(function(){
ready=true;
}
// I don't see any other opportunity to sync a promise here than this:
while(!ready) angular.noop();
// big question: did $http call the server now? Can we finally return in this method to let the browser 'exit' the page?
}
RFC您有两个问题:
- 您正在使用一个回调(事件处理程序)作为“最后的机会”,如果浏览器通常以特殊的方式处理它,那么这个事件处理程序,并且不打算在这里执行任何长时间运行的操作
- 此回调退出后,标准操作工作流将恢复,这意味着任何异步操作都可能不会完成,特别是如果保证不会在当前勾选中执行这些操作(承诺属于此类别,它们将永远不会通过设计同步解决)
- 避免使用异步代码。您可以在到达这一点之前执行http获取,存储结果并在onbeforeunload中同步使用它们
- 用于在页面终止后继续执行工作。同样,我建议在开始处理OnForeUpload之前创建、注册和激活worker。在onbeforeupload处理过程中,您希望向您的工作人员报告,要求其为您做一些工作。此选项附带两个注意事项:
- ServiceWorker不是一个已发布的标准,它仍然是一个草案,除了API更改、浏览器支持问题,还有API的潜在废弃
- 工作人员无法直接访问您的页面,您必须意识到这一点,这意味着什么。例如,没有对象,页面上没有加载库,为工作人员编写单独的脚本,仅通过显式消息交换数据等等
onbeforeunload
中使用异步Ajax,则没有任何保证,也没有支持的方法可以做到这一点。虽然它也有自己的问题,但是可以发送同步Ajax(冒着牺牲用户体验的风险)。通常,更好的解决方法是以不同的方式解决任何问题。有些人使用服务器上显示的关闭webSocket连接作为关闭页面的通知。webSocket可能是一个很好的解决方案。谢谢你能用WebSocket解决这个问题吗