声明并聆听自定义Chrome Ext事件

时间:2015-05-08 16:35:19

标签: javascript google-chrome-extension

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

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

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会监听这些事件。一旦检测到两者,它将执行其操作。

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

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

没有办法"周围"异步。

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