具有回调的Native Messaging postMessage

时间:2013-11-12 22:40:37

标签: 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"});

使用标准输入/输出进入我的原生应用程序,我得到了我的回复。

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

我知道通过sendMessageNative进行的“一次性消息传递”非常有用,除了我将我的本机应用程序用作状态机,因此它在完成后会杀死我的应用程序,这是不行的。

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:6)

您可以将另一个侦听器添加到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,之后侦听器将自行取消注册。

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