3

我從我的Chrome擴展的背景腳本中調用以下方法。目標是將消息發送到特定的選項卡,然後調用提供的回調方法和結果。重要的部分是callbackDone必須是總是在某個時間點調用。如此這般這樣:chrome.tabs.sendMessage回調函數未被調用。爲什麼?

function sendToTab(nTabID, callbackDone) 
{ 
    (function() 
    { 
     chrome.tabs.sendMessage(nTabID, { 
      action: "update01" 
     }, 
     function(response) 
     { 
      if(chrome.runtime.lastError) 
      { 
       //Failed to send message to the page 
       if(callbackDone) 
        callbackDone(nTabID, null); //Page never received the message 
      } 
      else 
      { 
       //Sent message OK 
       if(response.result === true) 
       { 
        if(callbackDone) 
         callbackDone(nTabID, true); //Success! 
       } 
       else 
       { 
        if(callbackDone) 
         callbackDone(nTabID, false); //Page returns failure 
       } 
      } 
     }); 
    }()); 
} 

然後從處理消息的頁面中(可以是注入content script),我把它處理這樣的:

chrome.runtime.onMessage.addListener(onMessageProc); 

function onMessageProc(request, sender, sendResponse) 
{ 
    if(request.action == "update01") 
    { 
     //Do processing .... that sets `bResult` 

     sendResponse({result: bResult}); 
    } 
} 

上述方法工作的很好,除了......我說,有一個頁面,像選項頁面腳本,不處理我update01消息,相反,它處理自己的消息,例如:

chrome.runtime.onMessage.addListener(onMessageProc); 

function onMessageProc(request, sender, sendResponse) 
{ 
    if(request.action == "update02") //Note different action ID 
    { 
     //Does some other actions... 
    } 
} 

在這種情況下,當我爲此選項卡調用第一個sendToTab方法時,我的callbackDone永遠不會被調用,即調用chrome.tabs.sendMessage並立即返回,但其回調函數永遠不會被調用。

那麼我在這裏錯過了什麼?

+0

我不認爲這是所有相關的代碼。 – Xan 2014-09-22 06:37:11

+0

@Xan:你在說什麼? – c00000fd 2014-09-22 08:30:37

+0

我認爲這很重要你的聽衆。它是,但是你的代碼片段就足夠了。 – Xan 2014-09-22 09:10:47

回答

5

您正在看到預期的行爲。

documentation狀態,對於回調函數:

如果指定responseCallback參數,它應該是一個函數,看起來像這樣:

function(any response) {...};

any response
的JSON由消息的處理程序發送的響應對象。如果在連接到指定選項卡時發生錯誤,則將調用不帶任何參數的回調,並且runtime.lastError將設置爲錯誤消息。

執行sendMessage有3種可能的結果。

  1. 有一個聽衆,它叫sendResponse
    然後,將回應作爲參數調用。

  2. 有一個監聽程序,它終止時沒有調用sendResponse(同步或異步)。
    然後,回調根本不叫

  3. 發送消息時出現某種錯誤。
    然後,回調被調用,沒有參數和chrome.runtime.lastError集合。

如果你需要回調在任何情況下執行,你需要在你的聽衆調用sendResponse「默認」的情況。

+0

謝謝。儘管如果你的3分被包含在文檔中,它確實會有所幫助。或者至少它會消除錯誤和混亂......你怎麼知道這一切? – c00000fd 2014-09-22 09:21:35

+0

在這種情況下,我只是測試它。然後,與文檔交叉引用,上面的引用可以像這樣解釋。 – Xan 2014-09-22 10:07:58

+0

@ c00000fd你沒有調用你的'sendResponse',並想知道爲什麼'response'函數永遠不會被調用?看起來像我預期的行爲。 – Teepeemm 2014-09-22 14:27:17

相關問題