Вы можете использовать встроенную функцию 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
включает селектор результата, поэтому значения, излучаемые наблюдаемой, содержат 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);
});