Javascript 在OnForeUnload中等待承诺

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

如果页面关闭,我想发送$http.get。然后我结结巴巴地问了一个问题,
无法解析承诺,因为如果最后一个方法返回,页面将被破坏

以下操作不起作用,因为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解决这个问题吗