reactjs 无法从弹出页面中的chrome.runtime.sendMessage获取响应useEffect [duplicate]

jum4pzuy  于 2023-08-04  发布在  React
关注(0)|答案(1)|浏览(104)

此问题已在此处有答案

sendResponse not waiting for async function or Promise's resolve [duplicate](1个答案)
昨天关门了。
下面是我的代码片段。
如何将响应发送到A或B或C位置?
sendResponse似乎只能在D中工作,而不是在A、B或C中,因为ABC在async await方法之后。

// in background.js, add listeners
chrome.runtime.onMessage.addListener(
  async function (request, sender, sendResponse) {
    if (request.type === 'get-text') {
      // sendResponse({abc:'abc'}) // works here. D
      const tab = await getTab();
      // sendResponse({bcd:'bcd'}) // doesn't work here. C
      const data = await chrome.scripting.executeScript({
        target: { tabId: tab.id },
        function: () => {
          // get text from dom 
          return text;
        },
        args: []
      }, (bundleData) => {
        // sendResponse({test:'test'}) // doesn't work here. B
      });

      // sendResponse({efg:'efg'}) // doesn't work here. A
    }
}

个字符
我的Chrome扩展是基于React 18构建的。使用manifest v3

jogvjijk

jogvjijk1#

要在chrome扩展中发送响应,您可以使用sendResponse函数。虽然它有一些限制,例如它只能从侦听器函数中调用,并且每条消息只能调用一次,但它可以帮助像您这样的基本程序。

// in background.js
if (request.type === 'get-text') {
  const sendResponse = (data) => {
    chrome.runtime.sendMessage({ data });
  };
  const data = await chrome.scripting.executeScript({
    target: { tabId: tab.id },
    function: () => {
      // get text from dom 
      return text;
    },
    args: []
  });
  sendResponse(data[0].result);
}

// in popup.jsx
useEffect(() => {
  const getText = async () => {
    const response = await chrome.runtime.sendMessage({ type:'get-text' })
    console.log(response);
  }
  getText().catch(e=>console.log('error: ', e))
}, [])

字符串

相关问题