- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
警告:这里是 RxJS 新手。
这是我的挑战:
onUnlink$
observable 发出...onAdd$
observable 中捕获值,最多持续 1 秒(我将此分区称为 onAddBuffer$
)。doc$
observable)以获取我们将用于匹配 onAdd$
值之一的模型onAddBuffer$
可观察值中的一个值与 doc$
值匹配,则不发射onAddBuffer$
可观察值中没有任何值与 doc$
值匹配,或者如果 onAddBuffer$
可观察值从不发出,则发出doc$
值这是我最好的猜测:
// for starters, concatMap doesn't seem right -- I want a whole new stream
const docsToRemove$ = onUnlink$.concatMap( unlinkValue => {
const doc$ = Rx.Observable.fromPromise( db.File.findOne({ unlinkValue }) )
const onAddBuffer$ = onAdd$
.buffer( doc$ ) // capture events while fetching from db -- not sure about this
.takeUntil( Rx.Observable.timer(1000) );
// if there is a match, emit nothing. otherwise wait 1 second and emit doc
return doc$.switchMap( doc =>
Rx.Observable.race(
onAddBuffer$.single( added => doc.attr === added.attr ).mapTo( Rx.Observable.empty() ),
Rx.Observable.timer( 1000 ).mapTo( doc )
)
);
});
docsToRemove$.subscribe( doc => {
// should only ever be invoked (with doc -- the doc$ value) 1 second
// after `onUnlink$` emits, when there are no matching `onAdd$`
// values within that 1 second window.
})
这总是发出 EmptyObservable
。也许是因为 single
似乎在没有匹配时发出 undefined
,而我期望它在没有匹配时根本不会发出? find
也会发生同样的事情。
如果我将 single
更改为 filter
,则不会发出任何内容。
仅供引用:这是一个包含文件系统事件的重命名场景——如果 add
事件在 unlink
事件发生后的 1 秒内发生并且发出的文件哈希匹配,则执行没什么,因为它是一个重命名
。否则它是一个真正的 unlink
并且它应该发出要删除的数据库文档。
最佳答案
这是我的猜测,你可以如何做到这一点:
onUnlink$.concatMap(unlinkValue => {
const doc$ = Rx.Observable.fromPromise(db.File.findOne({ unlinkValue })).share();
const bufferDuration$ = Rx.Observable.race(Rx.Observable.timer(1000), doc$);
const onAddBuffer$ = onAdd$.buffer(bufferDuration$);
return Observable.forkJoin(onAddBuffer$, doc$)
.map(([buffer, docResponse]) => { /* whatever logic you need here */ });
});
single()
运算符有点棘手,因为它仅在源 Observable 完成 后才发出与谓词函数匹配的项(或在出现错误时发出错误)是两个项目或没有匹配的项目)。
race()
也很棘手。如果其中一个源 Observables 完成并且没有发出任何值 race()
将完成并且不会发出任何东西。我前段时间报告过这个,这是正确的行为,请参阅 https://github.com/ReactiveX/rxjs/issues/2641 .
我想这就是您的代码中的错误所在。
另请注意,.mapTo(Rx.Observable.empty())
会将每个值映射到 Observable 的实例中。如果您想忽略所有值,您可以使用 filter(() => false)
或 ignoreElements()
运算符。
关于javascript - RxJS:如何将多个嵌套的可观察对象与缓冲区结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47870632/
我是一名优秀的程序员,十分优秀!