2012-02-13 165 views
1

我有一個後臺腳本負責獲取和設置數據到localStorage數據庫。我的內容腳本必須與後臺腳本通信以發送和接收數據。Chrome擴展中異步消息傳遞的最佳設計模式是什麼?

現在我發送一個JSON對象給包含命令和數據的函數。因此,如果我試圖添加一個對象到數據庫,那麼創建JSON的命令屬性是addObject,另一個對象是數據。完成後,後臺腳本會發送回應,說明它已成功。

函數的另一個用例是詢問數據,在這種情況下,它將發送一個對象而不是成功/失敗。

一旦我開始嘗試從後臺腳本中檢索返回的對象,代碼就會變得有點黑。

看來有可能是一個簡單的設計問題,在這裏,我不熟悉。有些人提出了未來/承諾的設計問題,但我還沒有找到一個很好的例子。

內容腳本

function sendCommand(cmdJson){ 
    chrome.extension.sendRequest(cmdJson, function(response){ 
     //figure out what to do with response 
    }); 
} 

背景腳本

if (request.command == "addObject"){ 
    db[request.id]= JSON.stringify(request.data); 
    sendResponse("success"); 
} 
else if(request.command == "getKeystroke"){ 
var keystroke = db[request.id]; 
sendResponse(keystroke); 
} 

回答

1

您的系統看起來確定,這裏有一些小的改進。

對於每個遠程命令發送回同一類型的對象(具有可能是空的字段):

var response = { 
    success: true, // or false 
    data: {}, 
    errors: [], 
    callback: '' 
} 

另外,如果有一個回送數據的多個不同的命令,則可以與對象查找替換if-else

var commands = { 
    addObject: function() { /* ... */ }, 

    getKeystroke: function (request, response) { 
     response.data = db[request.id] 
    } 
} 

然後,如果您有任何數據要回應,只需將其添加到對象。和發送同一個對象的任何命令:

var fn = commands[request.commands] 
fn(request, response) 

至於搞清楚什麼與響應做,我要傳遞一個回調到sendCommand功能,讓內容腳本請求和處理響應數據,因爲他們看到fit:

function sendCommand(cmdJson, callback){ 
    chrome.extension.sendRequest(cmdJson, callback) 
} 
+0

如何確定執行命令後要返回哪些代碼?我只看看返回的數據,還是應該添加一個字段來顯式指定要調用的函數? – ZeroDivide 2012-02-13 05:29:25

+0

說明在內容腳本中調用哪個函數。查看更新。 – katspaugh 2012-02-13 05:57:28

相關問題