javascript - 带回调的原生消息 postMessage

标签 javascript google-chrome google-chrome-extension chrome-native-messaging

所以,我创建了一个端口

var port = chrome.runtime.connectNative("my.native.app");

我会定义

port.onMessage.addListener(onNativeMessage);
port.onDisconnect.addListener(onDisconnect);

所以当我打电话

port.postMessage({"text":"messsage"});

它使用标准输入/输出转到我的 native 应用程序,我得到了响应。

这是我的问题:我有几个函数需要响应,而其他函数则不需要。我希望能够发布一条消息并等待来自 native 应用程序(持续运行)的响应。这是怎么做到的?

我知道通过 sendMessageNative 的“一次性消息传递”效果很好,除了我将我的 native 应用程序用作状态机,所以它会在完成后终止我的应用程序,这不好.

最佳答案

您可以向 onNativeMessage 添加另一个监听器来调用您的回调,然后取消注册。

类似这样的东西,带有闭包:

function callbackOnId(ev, id, callback) {
  var listener = ( function(port, id) {
    var handler = function(msg) {
      if(msg.id == id) {
        ev.removeListener(handler);
        callback(msg);
      }
    }
    return handler;
  })(ev, id, callback);
  ev.addListener(listener);
}

/* ... */
callbackOnId(port.onMessage, "someRequestId", callback);
port.postMessage({"text":"message", "id": "someRequestId"});

现在,当您的端口第一次收到包含 "id": "someRequestId" 的消息时,将使用该消息调用 callback,之后监听器将-注册自己。

如果需要,您可以添加删除监听器和/或修改消息检查的功能。

关于javascript - 带回调的原生消息 postMessage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19941442/

相关文章:

javascript - requirejs中document.ready之前执行代码

javascript - 控制 popup.html 弹出的时间

javascript - chrome.webRequest 未定义

google-chrome - 如何在工具栏中制作谷歌扩展选项页面

javascript - bootstrap Accordion 在自定义 opencart 主题的结账页面中不起作用

javascript - 动态替换下拉菜单选项 jQuery

javascript - 匹配所有以四个空格为前缀的行

javascript - Google Chrome App - 检查应用程序还是常规站点

javascript - 如何使用 API 关闭 Google Chrome 窗口中的所有选项卡

javascript - 简单加法暴露 Javascript 引擎浮点错误