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)
}
如何确定执行命令后要返回哪些代码?我只看看返回的数据,还是应该添加一个字段来显式指定要调用的函数? – ZeroDivide 2012-02-13 05:29:25
说明在内容脚本中调用哪个函数。查看更新。 – katspaugh 2012-02-13 05:57:28