javascript - CHROME-EXTENSION: chrome.runtime.lastError inget flik med id-fel


Jag arbetar på ett projekt som skapar ett Google Chrome-tillägg och jag använder Chrome API:er i det. Nu försöker jag få min handleTabUpdate-funktion att fungera när en flik uppdateras. Men jag får Unchecked runtime.lastError: No tab with id: 60

Hur kan jag fixa det? Här är min kod:

chrome.tabs.onUpdated.addListener(handleTabUpdate)
function handleTabUpdate(tabId, info) {
  if (info.status === 'loading') {
    store.dispatch({ type: 'RESET_TABHOSTS' })
    chrome.tabs.get(tabId, (activeTab) => {
      if (tabId === store.getState().currentTab['id']) {
        store.dispatch({ type: 'ACTIVE_TAB', payload: activeTab })
      }
    })
  }
}

Svar #1

Stötte precis på detta problem i MV3 och jag har skapat en lösning som tillåter lite mer lätthet när man arbetar med flikar.

Funktioner

const handleRuntimeError = () => {
    const error = chrome.runtime.lastError;
    if (error) {
        throw new Error(error);
    }
};

const safeGetTab = async (tabId) => {
    const tab = await chrome.tabs.get(parseInt(tabId));
    try {
        handleRuntimeError();
        return tab;
    } catch (e){
        console.log('safeGetTab', e.message);
    }
    return {};
};

Implementering

(async () => {
  // assumes some tabId
  const tab = await safeGetTab(tabId);
})()

Detta kommer att returnera ett värde oavsett vad. Det kommer antingen att returnera flikobjektet eller ett tomt objekt. Sedan kan du helt enkelt göra några grundläggande kontroller i ditt skript för att avgöra hur du vill hantera det. I mitt fall kan jag helt enkelt ignorera åtgärden som skulle ha vidtagits på den fliken och gå vidare.

Svar #2

Min gissning är att fliken du letar efter stängdes, så när du försöker hämta den med id misslyckas operationen.
För att undvika felet är mitt förslag att först fråga alla flikar och se om en flik med ett specifikt id finns i resultatet. Om den gör det, kör chrome.tabs.get() och använd din logik.