tools how hacer google editar developer dev debugger debuggear debug como chrome javascript asynchronous google-chrome-extension breakpoints google-chrome-devtools

javascript - how - Después de llamar a chrome.tabs.query, los resultados no están disponibles



editar javascript chrome (1)

Su problema se puede simplificar a:

/*1.*/ var fourmTabs = []; /*2.*/ chrome.tabs.query({}, function(tabs) { /*3.*/ fourmTabs[0] = tabs[0]; /*4.*/ }); /*5.*/ console.log(fourmTabs[0]);

fourmTabs que la matriz fourmTabs se actualice (por la línea 3) cuando se alcance la línea 5.
Eso está mal , porque el método chrome.tabs.query es asíncrono .

En un intento por hacerle comprender el significado del aspecto asincrónico, muestro un fragmento de código con la misma estructura que su código y una historia.

/*1.*/ var rope = null; /*2.*/ requestRope(function(receivedRope) { /*3.*/ rope = receivedRope; /*4.*/ }); /*5.*/ grab(rope);

  • En la línea 1, se anuncia la presencia de una cuerda.
  • En las líneas 2 a 4, se crea una función de devolución de llamada , que debe ser llamada por la función requestRope .
  • En la línea 5, agarrarás la cuerda mediante la función de grab .

Cuando requestRope se implementa de forma sincronizada , no hay problema:
Tú: "Hola, quiero una cuerda. Por favor, tira la cuerda ", llama a la función de devolución de llamada " cuando tengas una".
Ella: "Claro". tira la cuerda
Tú: Salta y agarra la cuerda : logras llegar al otro lado, vivo .

Cuando requestRope se implementa de forma asincrónica , puede tener un problema si lo trata como sincrónico:
Usted: "Por favor, arrojame una cuerda".
Ella: "Claro. Echemos un vistazo ..."
Tú: saltas e intenta agarrar la cuerda. Porque no hay cuerda, te caes y mueres.
Ella: lanza una cuerda Demasiado tarde, por supuesto.

Ahora que ha visto la diferencia entre una función implementada de forma asincrónica y sincrónica, resuelvamos su pregunta original:

var fourmTabs = new Array(); chrome.tabs.query({}, function (tabs) { for (var i = 0; i < tabs.length; i++) { fourmTabs[i] = tabs[i]; } // Moved code inside the callback handler for (var i = 0; i < fourmTabs.length; i++) { if (fourmTabs[i] != null) window.console.log(fourmTabs[i].url); else { window.console.log("??" + i); } } }); // <moved code inside callback function of chrome.tabs.query>

Con los puntos de interrupción, su código funciona, porque cuando se llega a la segunda parte del código, ya se ha llamado a la devolución de llamada.

Estoy creando (aprendiendo) una extensión para Google Chrome.

Para depurar algún código, console.log() , de la siguiente manera:

var fourmTabs = new Array(); chrome.tabs.query({}, function (tabs) { for (var i = 0; i < tabs.length; i++) { fourmTabs[i] = tabs[i]; } }); for (var i = 0; i < fourmTabs.length; i++) { if (fourmTabs[i] != null) window.console.log(fourmTabs[i].url); else { window.console.log("??" + i); } }

Es un código muy simple: obtenga toda la información de pestañas en una matriz propia e imprima algunas cosas.

Para verificar si el código funciona como debería, ejecuto el código. Aquí viene el problema:

  • Cuando uso puntos de interrupción (a través de las herramientas de desarrollo), el código funciona bien.
  • Sin puntos de interrupción, no se imprime nada.

¿Alguna idea de por qué?