I’m creating (learning) an extension for Google Chrome.
To debug some code, I inserted console.log(), as follows:
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);
}
}
It’s very simple code: get all tabs info into an array of my own, and print some things.
To check whether the code works as it should, I run the code. Here comes the problem:
- When I use breakpoints (via the Developer tools), the code runs fine.
- Without breakpoints, nothing is printed.
Any idea why?
Your problem can be simplified to:
You expect that the
fourmTabsarray is updated (by line 3) when line 5 is reached.That is wrong, because the
chrome.tabs.querymethod is asynchronous.In an attempt to make you understand the significance of the asynchronous aspect, I show a code snippet with the same structure as your code and a story.
requestRopefunction.grabfunction.When
requestRopeis implemented synchronously, there’s no problem:You: “Hi, I want a rope. Please throw the rope“call the callback function” when you’ve got one.”
She: “Sure.” throws rope
You: Jumps and grabs rope – You manage to get at the other side, alive.
When
requestRopeis implemented asynchronously, you may have a problem if you treat it as synchronous:You: “Please throw a rope at me.”
She: “Sure. Let’s have a look…”
You: Jumps and attempts to grab rope Because there’s no rope, you fall and die.
She: Throws rope Too late, of course.
Now you’ve seen the difference between an asynchronously and synchronously implemented function, let’s solve your original question:
With breakpoints, your code works, because by the time that the second part of the code is reached, the callback has already been called.