打开 window 里面的承诺

Open window inside promise

我们正在使用 promise 库 Q,但遇到以下问题。 window.open() is blocked by browser when is called from promise

我们尝试在 promise 机制启动之前打开 window,这是可行的,但问题是当打开新选项卡(并获得焦点)时,所有浏览器资源都指向新选项卡和逻辑仍然在第一个选项卡中完成,这导致性能不佳。

还有其他方法可以处理这个问题,可能是在承诺完成时使用事件,然后捕获此事件并打开新的 window。

更新

“所有浏览器资源都引用新标签页”是什么意思 我们发现了有趣的行为 :) 当用户单击按钮时,我们正在 运行ning 应用程序,在这种情况下,我们打开新选项卡并将焦点更改为新选项卡,我们正在等待应用程序启动,这大约需要 15 秒(直到实际申请 运行ning)。 我们进行了以下测试(非常有趣 :)),当我们单击 运行 应用程序并打开新选项卡时,我们 立即 单击返回第一个选项卡(有按钮),这样做的时间减少到 4.5 秒!焦点似乎改变了浏览器处理资源的方式。

我正在寻找替代解决方案!

这是因为两项政策之间存在冲突:

  1. 根据规范,承诺异步执行 .then() 个处理程序(在当前事件循环完成后)。

  2. 出于可用性和安全原因 window.open() 只能从直接用户操作调用(在由用户操作启动的同一事件循环处理期间或之后的短时间内一些用户操作)。

由于 #2,您将无法从遵循承诺规范的承诺的 .then() 处理程序打开 window。

通常的解决方法是在用户点击时同步打开 window(在 promise 解决之前),然后填写您已经拥有的 window 的内容当 promise 解决时打开或在错误情况下关闭 window。这并不理想,但如果异步操作涉及到 window 的打开,除了在浏览器插件(而不是从普通网页脚本)中获得提升的权限之外,真的没有其他选择。

有关如何通过实施此解决方法解决特定编码问题的更多详细帮助,您必须将实际代码添加到您的问题中并描述您 运行 遇到的具体问题。

寻求特定代码帮助的问题必须包含您希望获得帮助的代码。