localstorage getitem data javascript google-chrome google-chrome-extension race-condition

getitem - set local storage javascript



Error de extensión de Chrome: "runtime.lastError no verificado mientras se ejecuta browserAction.setIcon: sin pestaña con id" (1)

Estoy codificando mi extensión de Google Chrome donde establecí el icono de la aplicación desde el script de fondo como tal:

try { objIcon = { "19": "images/icon19.png", "38": "images/icon38.png" }; chrome.browserAction.setIcon({ path: objIcon, tabId: nTabID }); } catch(e) { }

Tenga en cuenta que envolví la llamada en el bloque try / catch.

Aún así, a veces obtengo el siguiente mensaje en el registro de la consola:

Deshabilitado runtime.lastError al ejecutar browserAction.setIcon: Sin pestaña con id: 11618.

Es difícil solucionar este error porque parece surgir solo cuando cierro o vuelvo a cargar la pestaña de Chrome, no tiene un número de línea ni información para seguir, además no es fácil ejecutar un depurador (es decir, no puedo establecer un punto de inflexión en el momento en que ocurre el error, pero si configuro a ciegas un punto de quiebre en la línea chrome.browserAction.setIcon() , ya no veo el mensaje en el registro).

Entonces, tengo curiosidad si alguien pudiera sugerir cómo remediar este error.

EDITAR : solo para publicar una actualización. Todavía no puedo resolver este problema. La sugerencia propuesta por @abraham a continuación ofrece un enfoque algo funcional , pero no es seguro. Por ejemplo, en una situación en la que la pestaña se está cerrando, puedo llamar a su chrome.browserAction.setIcon() sugerida que puede tener éxito si la pestaña aún no está cerrada, pero mientras está dentro de su función de devolución de llamada, la pestaña puede cerrarse y, por lo tanto, cualquier llamada consecutiva a alguna otra API que requiera la misma ID de pestaña, digamos setBadgeBackgroundColor() aún me puede dar la misma excepción No tab with id . En otras palabras, para aquellos que conocen la programación nativa , esta es una situación de condición de carrera clásica. Y no estoy seguro si es un error en Chrome, porque obviamente JS no ofrece ningún método de sincronización de subprocesos ...

He sido testigo de este comportamiento varias veces mientras hacía las pruebas. No sucede a menudo porque estamos hablando de una situación de tiempo muy precisa, pero sucede. Entonces, si alguien encuentra una solución, publíquela a continuación.


Incluya una devolución de llamada y revise chrome.runtime.lastError .

objIcon = { "19": "images/icon19.png", "38": "images/icon38.png" }; function callback() { if (chrome.runtime.lastError) { console.log(chrome.runtime.lastError.message); } else { // Tab exists } } chrome.browserAction.setIcon({ path: objIcon, tabId: nTabID }, callback);