我正在尝试通过声明和监听自定义 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 各自发送一个事件,例如 Action1CompleteEvent
和 Action2CompleteEvent
,而操作 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/