声明和监听自定义 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 各自发送一个事件,如 Action1CompleteEvent
和 Action2CompleteEvent
,操作 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 本身并不适用于它们 - 你需要用一些辅助函数包装它.这可能会使您的代码更易于管理。
我正在尝试通过声明和侦听自定义 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 监听这些事件。一旦两者都被检测到,它将执行其操作。
这可能吗?有哪些方法可以达到人们一直在使用的相同效果?
感谢您的宝贵时间。
没有办法"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 本身并不适用于它们 - 你需要用一些辅助函数包装它.这可能会使您的代码更易于管理。