调用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> 

有了断点,代码就可以工作,因为到达代码的第二部分时,回调已经被调用。