Chrome扩展中异步消息传递的最佳设计模式是什么?

问题描述:

我有一个后台脚本负责获取和设置数据到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); 
} 

您的系统看起来确定,这里有一些小的改进。

对于每个远程命令发送回同一类型的对象(具有可能是空的字段):

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