我正在使用后台脚本连接Chrome扩展程序。 对于简单的同步调用,它工作正常。我发送消息并得到回复。
显然,下面的getValue
在内部使用带有Dexie承诺的IndexedDB,不允许使用简单的sendResponse
。我看到处理这个问题的方法是发送消息作为回应。
但是,对我来说,这并没有多大意义。后台脚本只检查是否在数据库中找到特定键的值。扩展应该阻塞,直到返回密钥的值。
我能以某种方式展开这个以使用sendResponse
吗?也许将return findData()
包装成同步函数?
chrome.runtime.sendMessage({
request:'getValue',
key: shortcutKey
}, (data) => {
debugLog('getShortcut:', data);
let value = data.value;
console.log(`for key: ${key} found ${value}`);
...
do_my_thing();
});
后台脚本:
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
switch (request.name) {
case 'getClipboard':
sendResponse({clipboard:getClipboard()});
break;
case 'getValue':
console.log(`background::getValue handler key:`, request.key);
return findData(request.key.substring(constants.PREFIX.length)).then((result) => {
console.log(`findData return: ${result}`);
sendResponse( { value: result });
});
break;
...
}
});
答案 0 :(得分:2)
在asyncronius情况下只需return true
!
注意:sendResponse回调仅在同步使用时有效,或者如果事件处理程序返回true以指示它将异步响应。如果没有处理程序返回true或者sendResponse回调是垃圾收集的,则将自动调用sendMessage函数的回调。 https://developer.chrome.com/apps/messaging