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 - Closure 编译器不支持 ES6

javascript - 我可以在电子邮件通讯中使用“点击打印”按钮吗?

php - ERR_CONNECTION_RESET 与 PHP 脚本

Javascript createElement() 在 Chrome 中不工作

javascript - 如何让 Chrome 扩展程序休眠一段时间并在端口上发布消息

google-chrome-extension - 为什么我需要将我的 Chrome 扩展程序发布到 Chrome 网上应用店?

javascript - 三个词由两个逗号分隔的正则表达式

javascript- 引用错误 : require is not defined

html - HTML:iframe是透明的,并且iframe中的表单元素可以在Chrome中进行编辑

javascript - Chrome 扩展消息队列