Javascript 带回调的本机消息传递postMessage

Javascript 带回调的本机消息传递postMessage,javascript,google-chrome,google-chrome-extension,chrome-native-messaging,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"}); 它使用标准输入/输出进入我的本机应用程序,我得到了响应 我的问题

因此,我创建了一个端口

var port = chrome.runtime.connectNative("my.native.app");
我来定义

port.onMessage.addListener(onNativeMessage);
port.onDisconnect.addListener(onDisconnect);
所以当我打电话的时候

port.postMessage({"text":"messsage"});
它使用标准输入/输出进入我的本机应用程序,我得到了响应

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


我知道,通过
sendMessageNative
发送“一次性消息”效果很好,但我将本机应用程序用作状态机,因此在完成后会终止应用程序,这是不好的。

我的解决方案是为每条消息分配一个唯一的id,并使用映射存储每条消息id的回调函数(如果消息有回调)

当您收到来自主机的消息时,请检查消息id并查找回调映射。如果有一个回调绑定到该消息,请传递响应数据并调用它!

您可以将另一个侦听器添加到
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”
,将使用该消息调用
回调
,之后侦听器将注销自身


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

我不理解您问题的答案。我的问题与您的问题类似,如果您能解释更多信息,请回答。