2014-05-13 67 views
1

在我的測試中,代碼似乎總是按照chrome.tabs.executeScript調用的順序在目標選項卡中執行。例如,我看到數字0..99記錄,以便在目標選項卡上的控制檯,當我運行此:是否將代碼傳遞給順序的chrome.tabs.executeScript調用保證按順序運行?

for (var i = 0; i < 100; i++) { 
    chrome.tabs.executeScript(150, {code: 'console.log(' + i + ')'}, function() {}); 
} 

我想知道如果我可以依靠定購行爲。如果是這樣,我可以通過同時調用chrome.tabs.executeScript 10次來同時請求10個腳本執行 - 即使某些後續腳本依賴於某些早期腳本。

替代方法較慢:請求僅在當前腳本完成後(即從其回調)執行下一個腳本。這種方法的第二個缺點是我的擴展中的其他事件處理(例如,處理來自剛剛注入到標籤中的內容腳本的消息)可以與內容腳本執行交錯,進一步減慢它的速度。

回答

3

chrome.tabs.executeScript的相對執行順序沒有記錄,但它極有可能依賴於它的順序。

在幕後,executeScript執行以下操作:

  1. 的JavaScript代碼調用UI線程(source code)上的本機代碼。
  2. 如果允許擴展程序在選項卡中執行代碼,UI線程會通過IPC(source code,source code)將消息的執行詳細信息發送給渲染器進程
  3. 當渲染器收到消息(source code)時,它將執行網頁中的代碼(source code)。當腳本在所有頁面中完成執行後,渲染器會將消息發送回擴展進程(source code)。
  4. 該消息由擴展進程接收,並調用回調(JavaScript)(source code)。

注意,一切在本流程是同步:JavaScript是單線程的,所以代碼同步地被處理。處理呼叫的本地代碼也同步運行,並且IPC中的消息也同步。

chrome.tabs.executeScript是在這個意義上,它塊擴展過程,直到標籤的代碼已經完成異步(即調用chrome.tabs.executeScript後,它立即返回,準備執行代碼中的下一個語句)。這很好,因爲您不希望您的擴展程序因執行內容腳本中的alert對話框而被凍結。

這個答案指的是trunk(Chrome 36)上的代碼,但我相信它在將來會保持準確,因爲沒有理由改變故意混合消息相對順序的實現。混合消息的最現實的方法之一是使本地代碼異步有不同的執行路徑(我認爲這不會發生)。

+0

謝謝。我會看看是否可以讓Chrome團隊記錄訂單是否可靠。某些保證會爲可靠性創造奇蹟。 – jaredjacobs