2012-03-18 76 views
0

無法弄清楚什麼是錯的。在異步回調方法調用時,onRequest不會觸發,但內容腳本中的相同請求有效。下面的示例代碼。來自異步回調的Chrome擴展程序sendRequest無法正常工作?

background.js 
============= 
... 
makeAsyncRequest(); 
... 
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { 
    switch (request.id) { 
    case "from_content_script": 
     // This works 
     console.log("from_content_script"); 
     sendResponse({}); // clean up 
    break; 
    case "from_async": 
     // Not working! 
     console.log("from_async"); 
     sendResponse({}); // clean up 
    break; 
    } 
}); 

methods.js 
========== 
makeAsyncRequest = function() { 
    ... 
    var xhr = new XMLHttpRequest(); 
    xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4) { 
     ... 
     // It works 
     console.log("makeAsyncRequest callback"); 
     chrome.extension.sendRequest({id: "from_async"}, function(response) { }); 
    } 
    } 
    ... 
}; 

UPDATE:清單配置文件。不要在這裏有什麼問題。

{ 
    "name": "TestExt", 
    "version": "0.0.1", 
    "icons": { 
    "48": "img/icon-48-green.gif" 
    }, 
    "description": "write it later", 
    "background_page": "background.html", 
    "options_page": "options.html", 
    "browser_action": { 
    "default_title": "TestExt", 
    "default_icon": "img/icon-48-green.gif" 
    }, 
    "permissions": [ 
    "tabs", "http://*/*", "https://*/*", "file://*/*", 
    "webNavigation" 
    ] 
} 
+2

'methods.js'放置在哪裏?你能顯示你的所有代碼,包括'manifest.json'嗎? – 2012-03-18 09:40:40

+0

添加了'manifest.json',但您仍未顯示如何執行'methods.js'。它位於哪裏?你可以擴大'...'嗎? – 2012-03-19 13:47:13

回答

0

我不認爲問題是你從異步請求發送消息,但是因爲你試圖從接收器在同一頁發送消息?你可以把這個sendmessage放在onreadystatechange之外,但仍然在後臺頁面,但它仍然不會觸發。你爲什麼要發送消息到同一頁面anywayz?

我只是把你的xhr請求放在一個內容腳本中,它調用的很好,所以現在我確定它是因爲你從接收器所在的頁面發送消息。

+0

我現在在'methods.js'中使用'bgpage.processAsyncResults()'。但我認爲這是錯誤的設計方法。 – User 2012-03-19 09:56:21

+0

好吧,我認爲我應該通過backgr callback func引用makeAsyncRequest - 似乎是正確的解決方案。 – User 2012-03-19 10:04:35

相關問題