所以,我创建了一个端口
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/