javascript - 声明并监听自定义 Chrome Ext 事件

标签 javascript google-chrome-extension

我正在尝试通过声明和监听自定义 Chrome 扩展事件来解决 Chrome 扩展功能的异步性质。到目前为止,我还没有找到任何相关的解决方案。

所以,这是我的 background.js 的结构(在 manifest.json 中设置 "persistent": false):

chrome.browserAction.onClicked.addListener(function(tab) {
    chrome.tabs.query({active: true, currentWindow: true},
        function(tabs) {
            //Action 1: chrome.tabs.sendMessage(tabs[0].id, ...
            //Action 2: chrome.tabs.sendMessage(tabs[0].id, ...
            //Action 3: chrome.tabs.create({url: someUrl, ...
        }
    )
});

操作 3 只能在操作 12 完成后执行。我在想,在完成其操作后,操作 1 和操作 2 各自发送一个事件,例如 Action1CompleteEventAction2CompleteEvent ,而操作 3 则监听这些事件。一旦检测到两者,它将执行其操作。

这可能吗?有哪些方法可以达到人们一直在使用的相同效果?

感谢您的宝贵时间。

最佳答案

没有办法“绕过”异步性。

每个异步 Chrome API 函数都接受回调参数。保证在操作后调用回调。

因此,您需要链接代码:

chrome.browserAction.onClicked.addListener(function(tab) {
    chrome.tabs.query({active: true, currentWindow: true},
        function(tabs) {
            chrome.tabs.sendMessage(/*...*/, function() {
              chrome.tabs.sendMessage(/*...*/, function() {
                chrome.tabs.create(/*...*/);
              });
            });
        }
    )
});

如果你愿意,你可以尝试雇用Promises ,尽管 Chrome API 本身并不支持它们 - 您需要用一些辅助函数来包装它。这可能会使您的代码更易于管理。

关于javascript - 声明并监听自定义 Chrome Ext 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30128752/

相关文章:

javascript - 如何在react Js中使用map实现嵌套循环

javascript - 计算 AngularJS 中 ng-if true 语句的数量?

javascript - 无法在 google chrome 扩展中使用 jquery

c++ - 可以使用消息从 native 应用程序发送到 chrome 扩展的数据的大小限制是多少

google-chrome - 如何确定是否安装了特定的 Chrome 浏览器扩展,与扩展提供程序无关

javascript - 如何等待脚本加载

javascript - TypeError : Application. registerInjection不是一个函数

javascript - atom ide 是如何工作的

javascript - 使用语义 ui 时 react 选择宽度问题

linux - 构建 Google Chrome NaCl 应用程序 .nexe 文件时找不到有效的库