2012-02-13 2 views
1

私は、localStorageデータベースへのデータの取得と設定を担当するバックグラウンドスクリプトを用意しています。私のコンテンツスクリプトは、データを送受信するためにバックグラウンドスクリプトと通信する必要があります。Chrome拡張機能の非同期メッセージ受け渡しに最適なデザインパターンは何ですか?

今は、コマンドとデータを含む関数にJSONオブジェクトを送信します。そのため、データベースにオブジェクトを追加しようとすると、addObjectというコマンド属性とデータである別のオブジェクトを持つJSONが作成されます。これが完了すると、バックグラウンドスクリプトは、それが成功したという応答を返します。

この関数の別の使用例は、成功/失敗ではなくオブジェクトを返す場合のデータを要求することです。

バックグラウンドスクリプトから返されたオブジェクトを取得しようとすると、コードがハックします。

ここで私がよく慣れていないことは、おそらくシンプルな設計上の問題があるようです。将来の/有望な設計上の問題を示唆している人もいますが、私は非常に良い例は見つけていません。

コンテンツスクリプト

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

は、お使いのシステムでは、[OK]を見て、ここでいくつかのマイナーな改良されています。あなたがデータを返送し、複数の異なるコマンドを使用している場合、あなたはオブジェクトの参照でif-elseを置き換えることが

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

また、各リモートコマンドの場合

(おそらく空のフィールドを持つ)オブジェクトの同じタイプを送り返します:

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

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

回答するデータがある場合は、オブジェクトに追加するだけです。そして、任意のコマンドのために同じオブジェクト送る:応答をどのように処理するかを考え出すについては

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

を、私はsendCommand関数にコールバックを渡し、彼らが見るように、コンテンツのスクリプトが応答データを要求し、処理してみましょうと思います適合:

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

コマンドの実行後にどのコードを返すのかを決定するにはどうすればよいですか?私は返されたデータを見ていますか、またはどの関数を呼び出すかを明示的に記述するフィールドを追加すべきですか? – ZeroDivide

+0

コンテンツスクリプトでどのような関数を呼び出すかを記述します。アップデートを参照してください。 – katspaugh

関連する問題