声明和监听自定义 Chrome Ext 事件

Declaring and listening to custom Chrome Ext event

我正在尝试通过声明和侦听自定义 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 只能在操作 1 2 完成后执行。我正在考虑在完成其操作后,操作 1 和 2 各自发送一个事件,如 Action1CompleteEventAction2CompleteEvent,操作 3 监听这些事件。一旦两者都被检测到,它将执行其操作。

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

感谢您的宝贵时间。

没有办法"around"异步。

每个异步 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 本身并不适用于它们 - 你需要用一些辅助函数包装它.这可能会使您的代码更易于管理。