2014-09-23 41 views
0

我使用chrome.runtime.sendMessage從內容腳本向我的分機發送消息。如何從onMessageExternal監聽器發送響應?

內容腳本:

chrome.runtime.sendMessage(extensionId, { 
     "some" : "request" 
     } 
    }, 
    function(response) { 
     alert("got response"); 
    } 
); 

在後臺腳本接收部分看起來像這樣:

背景腳本A

chrome.runtime.onMessageExternal.addListener(function(request, sender, sendResponse) { 
    console.log("send response"); 
    sendResponse({ 
     "some" : "response" 
    }); 
}); 

這非常適用:send response登錄到後臺頁面的控制檯,我收到了從內容腳本中提醒got response

我再介紹一些異步JavaScript來監聽器:

背景腳本B

chrome.runtime.onMessageExternal.addListener(function(request, sender, sendResponse) { 
    window.crypto.subtle.generateKey({ 
     name: "RSASSA-PKCS1-v1_5", 
     modulusLength: 2048, 
     publicExponent: new Uint8Array([1, 0, 1]), 
     hash: { 
      name: "SHA-256" 
     } 
    }, false, ["sign"]).then(function(keyPair) { 
     console.log("send response"); 
     sendResponse({ 
      "some" : "response" 
     }); 
    }); 
}); 

這裏的回調定期調用(意思,send response記錄到後臺頁面後控制檯內容腳本,但是從來沒有收到迴應(即沒有0​​警報)

我在做什麼錯 這裏?爲什麼responseCallback在A中但不在B中?這正是回撥鏈是或者不是?

回答

0

這似乎是鉻合金中的bug/feature。顯然,你需要返回true,否則該信息通道將被關閉:

https://developer.chrome.com/extensions/runtime.html#event-onMessageExternal

此功能失效時,事件偵聽器返回時,除非你從事件​​監聽器返回true,表示你希望以異步方式發送響應(這將使消息通道保持開放狀態,直到調用sendResponse爲止)。

添加return true;像這樣的背景劇本解決了這個問題:

chrome.runtime.onMessageExternal.addListener(function(request, sender, sendResponse) { 
    window.crypto.subtle.generateKey({ 
     name: "RSASSA-PKCS1-v1_5", 
     modulusLength: 2048, 
     publicExponent: new Uint8Array([1, 0, 1]), 
     hash: { 
      name: "SHA-256" 
     } 
    }, false, ["sign"]).then(function(keyPair) { 
     console.log("send response"); 
     sendResponse({ 
      "some" : "response" 
     }); 
    }); 
    return true; 
});