Я работаю над расширением Chrome в React, которое вызывает асинхронную функцию в фоновом скрипте.Для этого пользователь нажимает кнопку в скрипте содержимого, которая запускает эту функцию.Во время выполнения сценария кнопка показывает значок загрузки и должна вернуться к исходному сценарию.Я использую webext-redux для Redux в расширении: https://github.com/tshaddix/webext-redux
У меня это не работает должным образом, поэтому вот некоторый псевдокод, который работает, если окно браузера, в котором выполняется скрипт содержимого, остается открытым
Сценарий содержимого
componentDidMount() {
chrome.runtime.onMessage.addListener(
(request) => {
if(request.action === "syncComplete") {
this.props.dispatch(syncing(false))
}
});
}
sync() {
this.props.dispatch(syncing(true));
chrome.runtime.sendMessage({action: "sync"});
}
render() {
<a onClick={() => this.sync()}>
{this.props.syncing ? (<span><Icon type="loading" /> Syncing...</span>) : "Force Sync" }
</a>
}
Фоновый сценарий
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse){
if(request.action === "sync") startImport();
return true
});
async function startImport() {
...
// Large async function
// On complete or fail do:
chrome.tabs.query({url: "https://example.com/*"}, (tabs) => {
for (var i=0; i<tabs.length; ++i) {
chrome.tabs.sendMessage(tabs[i].id, {action: "syncComplete"});
}
});
}
Проблема, с которой я сталкиваюсь, заключается в том, что моя асинхронная функциявыполняется в фоновом сценарии (преднамеренно, чтобы пользователь мог продолжать перемещаться по сайту, на котором включен сценарий содержимого), если пользователь закрывает вкладку сценария содержимого и завершает фоновый сценарий, не выполняется сценарий содержимого для получения сообщения Chrome дляотправить действие синхронизации.Таким образом, все расширение застревает в постоянном состоянии «загрузки» на кнопке.
Кто-нибудь знает, как я могу справиться с этим или можно ли отправить действие из фонового скрипта?