我有一个脚本应该从后台获取一个值,基本上它返回一个项目,但由于某种原因它在再次调用该函数时返回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 的异步函数,但它不起作用
问题出在我的弹出反应应用程序中
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();
}, []);