如何解决在 chrome 扩展的后台脚本中循环下一项之前等待 contentscript 完成
我正在尝试制作 Chrome 扩展程序,但由于整个异步编程和通信,我有点头疼。
基本上我想做的是以下内容:
- 在后台脚本中循环遍历数组
- 向内容脚本发送一条消息,要求它必须执行一个函数。完成结果后告诉后台脚本 数据。
- 现在后台脚本应该等待接收到结果,然后再转到数组中的下一项。
- 接收到数据后,它应该移动到数组中的下一项
async function searchGoogle(url) {
let terms = ["food","nature","computers","trees","clothing"];
console.log(terms);
chrome.tabs.query({ active: true,currentwindow: true },async function (tabs) {
terms.forEach(function (term) {
console.log("Sending term..");
chrome.tabs.sendMessage(tabs[0].id,{ msg: "SEARCH_SINGLE_TERM",term: term },function (response) {
setTimeout(() => {
console.log(response);
},5000);
console.log(response);
});
});
});
}
$(document).ready(function () {
chrome.runtime.onMessage.addListener(function (message,sender,sendResponse) {
switch (message.msg) {
case "SEARCH_SINGLE_TERM":
firstUrl = searchSingleTerm(message.term);
return new Promise(function (resolve) {
console.log("starting wait");
setTimeout(resolve,5000);
}).then(() => {
console.log("done waiting");
sendResponse(firstUrl)
});
}
return true; // for sendResponse so it doesn't close the listener
});
});
function searchSingleTerm(term) {
document.querySelector('.gLFyf.gsfi').value = term
console.log("-- Executing click search button--");
document.querySelector('.Tg7LZd').click();
let firstUrl = document.querySelector('.yuRUbf a').href
return firstUrl
}
现在它仍然同时执行所有内容(它向内容脚本发送 5 条消息,这些消息全部同时运行而不是串行运行)。如何将其从并行转换为串行?
完整的 POC 在 github 上,可以在这里找到:https://github.com/YungFrikandelbroodje/SearchPOC
这只是为了说明问题。我知道这样的扩展实际上没有任何用处,但它显示了确切的问题;)
在自述文件中,我写了更多信息以使其尽可能清晰!
谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。