Я пишу расширение для Chrome и решил обернуть все в потоки, в основном для обучения и взглянуть на rxjs.
Так что я застрял с такой проблемой.У меня есть два потока, один поток статический (не знаю, как правильно его назвать) и один динамический .
Статический поток - это тот, кто генерирует значение только тогда, когда вы подписываетесь на него ( getPath $ ), и возвращает значение из хранилища Chrome.Динамический ( message $ ) поток - это поток, который прослушивает события (сообщения).
Так что моя цель состоит в том, чтобы каким-то образом объединить эти два потока и каждый раз, когда я получаю сообщение от message $ , получать значение из getPath $ и делать некоторыерасчеты основаны на двух значениях.
type Handler = (
message: any,
sender: any,
sendResponse: (response: any) => void
) => void;
type Values = string | string[];
const getValues = (values: Values) => (cb) => chrome.storage.local.get(values, cb)
const getPathBinded = bindCallback(getValues('path'))
const getPath$ = getPathBinded()
const message$ = fromEventPattern(
(handler: Handler) => chrome.runtime.onMessage.addListener(handler),
(handler: Handler) => chrome.runtime.onMessage.removeListener(handler),
(message, sender, sendResponse) => ({ message, sender, sendResponse })
).pipe(
map(
({ message }) => message
)
)
Я нашел, как это сделать таким образом:
message$.pipe(
switchMap(
_ => getPath$,
(oV, iV) => {
//doing some calculation
}
)
)
Или
combineLatest(
message$,
getPath$,
).pipe(
map((a, b) => {
//doing some calculation
})
)
Похоже, это работает,но такое чувство, что я делаю не так.Любые предложения или как это сделать, следуя лучшим подходам?Также, пожалуйста, поправьте меня в определениях.
UPD Здесь полный код: https://gist.github.com/ и последняя версия, которая работает
const merged$ = message$.pipe(
switchMap(sendedPath => combineLatest(
path$,
unit$
).pipe(
map(([path, unit]) => [sendedPath, path, unit]))
)
)