javascript - 在 onbeforeunload 中等待 promise

标签 javascript angularjs synchronization angular-promise onbeforeunload

如果页面关闭,我想发送一个 $http.get。然后我偶然发现了一个问题
promise 无法得到解决,因为如果最后一个方法返回,页面将被销毁。

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

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

}

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

我的想法是这样的:

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

最佳答案

你有两个问题:

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

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

  • 避免异步代码。您可以在到达此点之前执行 http 提取,存储结果并在 onbeforeunload 中同步使用它们。

  • 使用 ServiceWorker在页面终止后继续工作。同样,我建议在开始处理 onbeforeupload 之前创建、注册和激活 worker。在 onbeforeupload 处理期间 - 你想要 postMessage给你的 worker ,要求它为你做一些工作。此选项有 2 个注意事项:

  • ServiceWorker 不是已发布的标准,它仍然是一个草案,预计 API 会发生变化、浏览器支持问题以及实际上可能会废弃 API。

  • Worker 无法直接访问您的页面,您必须了解这一点,这意味着什么。例如 - 没有 window对象,您的页面上没有加载任何库,为工作人员提供单独的脚本,仅通过显式消息交换数据 - 仅举几例。

关于javascript - 在 onbeforeunload 中等待 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36379155/

相关文章:

javascript - 提交后如何清除文本字段值

javascript - 带有空值的 ExtJS JSON 记录

javascript - Angular 输入绑定(bind)两个字段

java - 线程同步说明

java - 最快的同步技术

c++ - Linux 信号量,在 forked->exec'd 进程之间共享?

javascript - 在 Three.JS 中向 Material 贴图添加纹理时出现 WebGL 警告

javascript - Jquery .toggle 替换代码

angularjs - 使用 AngularJS 在下拉菜单中 Bootstrap 输入字段

Javascript promise 与 Angular http 调用不水合对象