【问题标题】:Native Messaging postMessage with callback带有回调的本机消息传递 postMessage
【发布时间】:2023-04-07 19:53:02
【问题描述】:

所以,我创建了一个端口

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

我会定义

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

所以当我打电话时

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

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

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

我知道通过sendMessageNative 进行的“一次性消息传递”效果很好,只是我将本机应用程序用作状态机,所以它在完成后会杀死我的应用程序,这不好。

【问题讨论】:

  • 我不明白你的问题的答案。我的问题就像你的问题,如果你能解释更多。

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


【解决方案1】:

您可以向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,之后侦听器将自行注销。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      • 1970-01-01
      • 2014-09-29
      • 2020-06-21
      • 1970-01-01
      • 2012-06-11
      • 2010-09-20
      相关资源
      最近更新 更多