Kir*_*kus 4 javascript google-chrome google-chrome-extension chrome-native-messaging
所以,我创建了一个端口
var port = chrome.runtime.connectNative("my.native.app");
Run Code Online (Sandbox Code Playgroud)
我会定义
port.onMessage.addListener(onNativeMessage);
port.onDisconnect.addListener(onDisconnect);
Run Code Online (Sandbox Code Playgroud)
所以我打电话的时候
port.postMessage({"text":"messsage"});
Run Code Online (Sandbox Code Playgroud)
它使用标准输入/输出进入我的本机应用程序,我得到了我的回复.
这是我的问题:我有几个期望响应的函数,而其他函数没有.我希望能够发布消息并等待本机应用程序(持续运行)的响应.这是怎么做到的?
我知道"一次性消息"通过sendMessageNative哪个很好,除了我使用我的本机应用程序作为状态机,所以它在完成后杀死我的应用程序,这是不好的.
我的解决方案是为每个消息分配一个唯一的id,并使用map来存储每个消息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"});
Run Code Online (Sandbox Code Playgroud)
现在,您的端口第一次收到包含的消息时"id": "someRequestId",callback将使用该消息调用,之后侦听器将取消注册.
如果需要,可以添加删除侦听器和/或修改消息检查的功能.
| 归档时间: |
|
| 查看次数: |
3112 次 |
| 最近记录: |