0

我想創建一個Chrome擴展可以解釋通過鍵盤給出的命令。 此擴展的目的是,如果用戶按下ALT + A然後在警報框中顯示的標籤ID流序列在Chrome擴展

Manifest File : 
{ 
    "manifest_version": 2, 

    "name": "Toggle", 
    "description": "This App ", 
    "version": "1.0", 

    "background": { 
    "persistent": true, 
    "scripts": ["TabBackGround.js"] 
    }, 

    "commands": 
    { 
     "toggle" : 
     { 
      "suggested_key": { 
       "default": "Alt+A", 
       "mac": "Command+Shift+Y" 
      }, 
      "description" : "Toggle the tabs" 
     } 
    }, 

    "permissions": ["tabs", "background"], 

    "browser_action": { 
    "default_title": "This App will help to toggle through tabs on which videos is running", 
    "default_icon": "hello.png" 
    }  
} 

TabBackGround.js

var globalId; 

chrome.commands.onCommand.addListener(function(command) { 
    if (command == "toggle") 
    { 
     alert ("Command Resolved."); 
     var queryGetTabs = chrome.tabs.query({active: true, currentWindow: true}, function(arrayOfTabs) { 

      alert ("Function Executed."); 

      var activeTab = arrayOfTabs[0]; 
      var activeTabId = arrayOfTabs[0].id; 
      globalId = activeTabId; 
    }); 

     alert ("Pressed Toggle : " + globalId); 
    } 
}); 

輸出:命令解決。 按下切換 函數中執行。 我想了解什麼是JavaScript執行的流程。按下切換按鈕之前不應該執行功能聲明。

回答

1

大多數瀏覽器的API是異步的性能/響應的原因。你看到的是這樣的:

/* Some code that will execute first */ 
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
    /* Some code that will execute last */ 
} 
/* Some code that will execute second */ 

執行chrome.tabs.query不會立即做任何事情(並且不會返回任何東西,順便說一下),而是要求Chrome瀏覽器查詢標籤時,它可以,然後執行回調。順便說一句,這就是爲什麼它被稱爲「回調」的原因。

其他的方式來看待它:你註冊回調爲「工作完成」的事件處理程序。每當它實際完成時。

因此,您的函數將在調度此操作後繼續,並且不能使用回調函數的任何結果。如果你需要異步代碼,你需要鏈接你的電話:

/* Some code that will execute first */ 
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
    /* Some code that will execute second */  
    chrome.someOtherApiFunction(function() { 
    /* Some code that will execute last */ 
    }); 
} 
+0

有沒有辦法讓查詢調用同步? – 2014-09-30 06:48:12

+0

總之,沒有。這個調用實際上並不是在JavaScript中發生,而是在Chrome的本地代碼中發生,我認爲這些代碼與頁面的JS不同步。如果您想要一些更好的工具來處理異步代碼,您可以查看[Promises](http://www.html5rocks.com/en/tutorials/es6/promises/)。儘管在這裏可能是一個矯枉過正的問題。 – Xan 2014-09-30 06:52:22

+0

好感謝您的回覆。我瞭解同步和異步呼叫之間的區別,並相應地對代碼進行了更改。我正在嘗試顯示當前活動選項卡的選項卡標識和選項卡URl。 – 2014-10-01 04:31:27