异步使用onMessage.addListener的sendResponse

时间:2017-09-16 19:46:55

标签: javascript google-chrome-extension promise

我正在使用后台脚本连接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;
      ...
  }
});

1 个答案:

答案 0 :(得分:2)

在asyncronius情况下只需return true

  

注意:sendResponse回调仅在同步使用时有效,或者如果事件处理程序返回true以指示它将异步响应。如果没有处理程序返回true或者sendResponse回调是垃圾收集的,则将自动调用sendMessage函数的回调。 https://developer.chrome.com/apps/messaging