在开发 Chrome 扩展程序时,您遇到了一个问题,即通过 chrome.tabs.query 获取的结果是当代码在没有断点的情况下运行时不可用。为了分析这个问题,我们将深入研究 chrome.tabs.query 函数的异步性质。
异步函数,如 chrome.tabs.query,在以下位置执行其代码:稍后的时间点,独立于主执行流程。在您的代码片段中:
// Initialize an empty array var fourmTabs = new Array(); // Initiate asynchronous `chrome.tabs.query` call chrome.tabs.query({}, function (tabs) { // Iterate over returned tabs for (var i = 0; i < tabs.length; i++) { // Store tabs in array fourmTabs[i] = tabs[i]; } });
当此代码运行时,chrome.tabs.query 调用将执行并发起请求,但 JavaScript 执行会继续到下一行。作为 chrome.tabs.query 的第二个参数提供的回调函数不会立即调用。
// Print tab URLs (before callback has been called) for (var i = 0; i < fourmTabs.length; i++) { if (fourmTabs[i] != null) window.console.log(fourmTabs[i].url); else { window.console.log("??" + i); } }
在上面的代码中,当循环执行时,fourmTabs 数组仍然为空,因为回调函数有尚未被调用。因此,控制台会输出“??”对于每个选项卡。
使用断点,代码的执行会暂停,允许回调函数执行并更新 fourmTabs 数组。这确保第二个循环可以访问更新的选项卡信息并正确打印 URL。
要解决此问题并确保在代码运行时选项卡可用断点,将第二个循环移至 chrome.tabs.query 的回调函数内。这确保了循环在调用回调后执行:
// Initialize an empty array var fourmTabs = new Array(); // Initiate asynchronous `chrome.tabs.query` call chrome.tabs.query({}, function (tabs) { // Update `fourmTabs` array for (var i = 0; i < tabs.length; i++) { fourmTabs[i] = tabs[i]; } // Print tab URLs (after callback has been called) for (var i = 0; i < fourmTabs.length; i++) { if (fourmTabs[i] != null) window.console.log(fourmTabs[i].url); else { window.console.log("??" + i); } } });
通过此修改,代码将正确运行,而不需要断点,因为第二个循环仅在 fourmTabs 数组之后执行已通过回调函数更新。
以上是为什么我的 Chrome 扩展程序的选项卡信息显示为空且没有断点?的详细内容。更多信息请关注PHP中文网其他相关文章!