Каждый сценарий JavaScript является однопоточным, поэтому синхронная while
l oop будет работать вечно в одной задаче l oop, что означает ни один из асинхронных обратных вызовов query (), executeScript () и sendMessage () будет работать всегда, и ваше расширение будет бесконечно потреблять 100% ресурсов ЦП.
Решение состоит в том, чтобы сделать l oop асинхронным и позволить injectTheScript возвращать значение ответа скрипта содержимого через Promise
:
function injectTheScript() {
return new Promise(resolve => {
const name = document.getElementById('name').value;
chrome.tabs.query({active: true, currentWindow: true}, ([tab]) => {
chrome.tabs.executeScript(tab.id, {file: 'utilities.js'}, () => {
chrome.tabs.sendMessage(tab.id, name, resolve);
});
});
});
}
async function nextName() {
while (await injectTheScript()) {
console.log('yay');
}
}
Приведенный выше код ожидает, что ваш прослушиватель onMessage в скрипте содержимого вернет логическое значение через sendResponse:
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
// do something
// ..............
sendResponse(true); // or false
});
См. Учебные пособия по Promise
и асинхронные JavaScript для получения дополнительной информации. если нужно.