【发布时间】:2019-02-15 16:53:49
【问题描述】:
我正在编写 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 这里是完整的code: https://gist.github.com/ 以及最新版本的工作
const merged$ = message$.pipe(
switchMap(sendedPath => combineLatest(
path$,
unit$
).pipe(
map(([path, unit]) => [sendedPath, path, unit]))
)
)
【问题讨论】:
-
好吧,你的方法是对还是错取决于你想做什么......
-
是否应该在每条新消息中重新计算
chrome.storage.local.get(values, cb),或者对所有消息都使用第一个? -
@OlesSavluk 它应该每次都重新计算新消息
标签: typescript google-chrome-extension rxjs rxjs6