微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 chrome 扩展的后台脚本中循环下一项之前等待 contentscript 完成

如何解决在 chrome 扩展的后台脚本中循环下一项之前等待 contentscript 完成

我正在尝试制作 Chrome 扩展程序,但由于整个异步编程和通信,我有点头疼。

基本上我想做的是以下内容

  1. 后台脚本中循环遍历数组
  2. 内容脚本发送一条消息,要求它必须执行一个函数。完成结果后告诉后台脚本 数据。
  3. 现在后台脚本应该等待接收到结果,然后再转到数组中的下一项。
  4. 接收到数据后,它应该移动到数组中的下一项

这是后台脚本部分,它通过单个搜索查询内容脚本发送消息。

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 举报,一经查实,本站将立刻删除。