在onbeforeunload

时间:2016-04-02 21:52:24

标签: javascript angularjs synchronization angular-promise onbeforeunload

如果页面关闭,我想发送$ http.get。然后我磕磕绊绊地解决了一个问题 promises无法解析,因为如果最后一个方法返回,页面就会被破坏。

以下不起作用,因为onbeforeunload无法解析promises /不等待它们:

window.onbeforeunload = function(
    $http.get('http://someth.ing/update-state?page=unloaded').then(function(){
        // never called... never sent...
    }

}

我知道,你可以使用默认的同步HTTP方法,但问题通常是我们如何同步/等待promises在这里解决。

我的想法是这样的:

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

1 个答案:

答案 0 :(得分:2)

你有两个问题:

  • 如果浏览器通常以特殊的方式处理它,那么你正在使用一个回调(事件处理程序)作为“最后机会”,这个事件处理程序,并且不打算在这里进行任何类型的长时间运行。
  • 标准操作工作流将在此回调退出后恢复,这意味着任何异步操作都可能无法完成,特别是如果它们保证不会在当前刻度中执行(承诺属于此类别,它们将永远不会通过设计同步解决)。

那么如何在这些限制范围内工作呢?您有几个选择:

  • 避免异步代码。你可以在到达这一点之前进行http提取,存储结果并在onbeforeupload中同步使用它们。
  • 使用ServiceWorker在页面终止后继续工作。同样,我建议在处理onbeforeupload之前创建,重新绑定和激活worker。在onbeforeupload处理期间 - 您希望postMessage给您的员工,要求它为您做一些工作。此选项附带2个警告:

    • ServiceWorker不是已发布的标准,它仍然是一个草案,期望API更改,浏览器支持问题以及实际上可能一起废弃API。
    • 工作人员无法直接访问您的网页,您必须了解这一点,这意味着什么。例如 - 没有window对象,页面上没有加载库,工作者单独的脚本,仅通过显式消息交换数据 - 仅举几例。