在承诺

时间:2015-10-27 08:14:31

标签: javascript google-chrome javascript-events promise q

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

我们尝试在promise机制启动之前打开窗口,这是有效的,但问题是当打开一个新选项卡(并获取focues)时,所有浏览器资源都引用新选项卡,逻辑是仍然在第一个标签中完成,导致性能不佳。

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

更新

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

IM搜索替代解决方案!

1 个答案:

答案 0 :(得分:13)

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

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

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

  3. 由于#2,您将无法从遵守承诺规范的承诺的.then()处理程序中打开窗口。

    通常的解决方法是在用户点击时(在解析承诺之前)同步打开窗口,然后在承诺解决时填写您已经打开的窗口的内容,或者在错误的情况下填写关上窗户。这并不理想,但如果在打开窗口时涉及异步操作,除了获取提升的权限(例如在浏览器插件中)(而不是来自普通的网页脚本)之外,确实没有其他选择。

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

    要求特定代码帮助的问题必须包含您需要帮助的代码。