sendMessage回调数据为true

问题描述 投票:0回答:1

我有一个脚本应该从后台获取一个值,基本上它返回一个项目,但由于某种原因它在再次调用该函数时返回true。

在后台脚本项中始终为对象或未定义。它如何得到真实的回应对我来说是个谜

market.js

async function renderMarketItem(item) {
  //parsers name, type and quality of item
  let market_item = await new Promise((resolve, reject) => {
    if (chrome.runtime?.id) {
      chrome.runtime.sendMessage({
        action: "getMarketItem",
        name: formatData(type, name, quality)
      }, (item) => {
        resolve(item);
      })
    } else resolve(undefined);
  });
  //another logic
}

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
  if (message.action == 'updateConfig') {
    $('.items-grid').children().each(function() {
      renderMarketItem($(this));
    })
  }
});

/*for example*/
$('.items-grid').children().each(function() {
  renderMarketItem($(this));
})

背景.js

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
   if (message.action == 'getMarketItem') {
        sendResponse(getMarketItem(message));
    }
    if (message.action == 'updateConfig') {
        updateConfig(message, sender, sendResponse);
    }

});
const updateConfig = (message, sender, sendResponse) => {
    const {data} = message;
    getTabs((tabs) => {
        tabs.forEach((tab) => {
            chrome.tabs.sendMessage(tab.id, { action: 'updateConfig', data });
        });
    });
}
let getTabs = (callback = ()=>{}) => {
       chrome.tabs.query({ url: /*siteUrl*/ }, (tabs) => {
          callback(tabs);
       });
}
const getMarketItem = (message) => {
    
    let targetName = message.name;
    let item;
    if (targetName) item = items.find(item => item.market_hash_name.trim() == targetName.trim());
    return item;
}

我使用了 return true 的异步函数,但它不起作用

javascript google-chrome-extension chrome-extension-manifest-v3
1个回答
0
投票

问题出在我的弹出反应应用程序中

useEffect(() => {
    const handleMessage = async (message: any, sender: any, sendResponse: () => void) => {
      if (message.action === 'getConfig' && message.data) setConfig(message.data);
      return true;
    };

    runtime.onMessage.addListener(handleMessage);

    runtime.sendMessage({ action: 'needConfig' });
    return () => {
      runtime.onMessage.removeListener(handleMessage);
    };
  }, []);

此侦听器中断了内容脚本中的侦听器,当弹出窗口打开时,它返回 true。

我用这段代码替换了它,一切都正常工作:

useEffect(() => {
    const getConfig = async() => {
      let cfg = await runtime.sendMessage({ action: 'getConfig'});
      console.log(cfg);
      setConfig(cfg);
    }
    getConfig();
  }, []);
© www.soinside.com 2019 - 2024. All rights reserved.