调用chrome.tabs.query后,结果不可用
我正在创建(学习)Google Chrome的扩展程序。
为了调试一些代码,我插入了console.log()
,如下所示:
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); } }
这是非常简单的代码:获取所有标签信息到我自己的数组中,并打印一些东西。
为了检查代码是否正常工作,我运行代码。 问题来了:
- 当我使用断点(通过开发工具),代码运行良好。
- 没有断点,什么都不打印。
任何想法为什么?
你的问题可以简化为:
/*1.*/ var fourmTabs = []; /*2.*/ chrome.tabs.query({}, function(tabs) { /*3.*/ fourmTabs[0] = tabs[0]; /*4.*/ }); /*5.*/ console.log(fourmTabs[0]);
您预计到达第5 fourmTabs
,将更新fourmTabs
数组(第3行)。
这是错误的 ,因为chrome.tabs.query
方法是异步的 。
为了让您理解异步方面的重要性,我展示了一个与您的代码和故事具有相同结构的代码片段。
/*1.*/ var rope = null; /*2.*/ requestRope(function(receivedRope) { /*3.*/ rope = receivedRope; /*4.*/ }); /*5.*/ grab(rope);
- 在第1行,宣布绳子的存在。
- 在第2-4行创建了一个回调函数 ,该函数应该由
requestRope
函数调用。 - 在第五行,你将通过
grab
功能抓住绳子。
当requestRope
同步实现时,没有问题:
你:“嗨,我想要一根绳子,当你有一根绳子时,请把绳子 叫做”回拨功能“ 。
她:“当然。” 扔绳子
你: 跳绳并抓住绳子 – 你设法在另一边, 活着 。
当requestRope
异步实现时,如果将其视为同步的,可能会遇到问题:
你:“请把绳子给我。”
她:“当然,我们来看看…”
你: 跳跃并试图抓住绳子因为没有绳子,你就会死亡。
她: 当然, 扔绳子 太晚了。
现在你已经看到了异步和同步实现的功能之间的区别,让我们来解决你的原始问题:
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>
有了断点,代码就可以工作,因为到达代码的第二部分时,回调已经被调用。