gpt4 book ai didi

google-chrome-extension - Rx.js,Chrome 消息传递 API

转载 作者:行者123 更新时间:2023-12-04 18:56:38 25 4
gpt4 key购买 nike

在扩展程序的另一部分使用此代码发送消息后

chrome.runtime.sendMessage({greeting: "hello"});

任何可以使用此消息传递 API 的 Rx.js 专家
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
if (request.greeting == "hello")
sendResponse({farewell: "goodbye"});
});

并将其包装在一个发出新消息并允许发送响应的 Observable 中?

简单地将传入消息作为 Observable 发出是非常容易的。
const MessagingObservable = Rx.Observable.create(observer => {      
chrome.runtime.onMessage.addListener(listener);
function listener(request, sender, sendResponse) {
observer.next(request);
}
return () => {
chrome.runtime.onMessage.removeListener(listener);
};
});

但是如何绑定(bind) sendResponse 回调呢?

最佳答案

您可以使用内置的fromEventPattern创建一个可观察对象的函数,如下所示:

const messages = Rx.Observable.fromEventPattern(
handler => chrome.runtime.onMessage.addListener(handler),
handler => chrome.runtime.onMessage.removeListener(handler),
(request, sender, sendResponse) => ({ request, sender, sendResponse })
);

请注意,对 fromEventPattern 的调用包含一个结果选择器,因此 observable 发出的值包含 request , sender ,以及 sendResponse ,你会这样使用:

messages.subscribe(({ request, sender, sendResponse }) => {
console.log(request);
sendResponse(/* ... whatever ... */);
});

支持调用 sendResponse异步,监听器需要能够返回 true .这可以通过包装 handler 来完成。 , 像这样:

const messages = Rx.Observable.fromEventPattern(
handler => {
const wrapper = (request, sender, sendResponse) => {
const event = { async: false, request, sender, sendResponse };
handler(event);
return event.async;
};
chrome.runtime.onMessage.addListener(wrapper);
return wrapper;
},
(handler, wrapper) => chrome.runtime.onMessage.removeListener(wrapper)
);

你会像这样使用它:

messages.subscribe(event => {
console.log(event.request);
event.async = true;
setTimeout(() => event.sendResponse(/* ... whatever ... */), 1000);
});

关于google-chrome-extension - Rx.js,Chrome 消息传递 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51046571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com