我试图找出一种执行以下操作的rxjs方法:
您有两个可观察的对象,一个onAddObs和onRemoveObs。
假设onAddObs.next()触发了几次,并添加了“ A”,“ B”,“ C”。
我想得到[“ A”,“ B”,“ C”]。
.toArray需要完成可观察到的工作...还有更多可能。
这是第一部分。第二部分可能很明显...
我希望onRemoveObs然后从最终的结果数组中删除。
我没有笨拙的cuz,我无法做到这一点...
提前致谢!
更新
根据user3743222的建议,我签出了.scan,完成了该工作!
如果其他人对此有疑问,我会提供一个angular2服务,它显示了一种很好的方法。诀窍是使用.scan,而不是添加/删除的流,而是要添加/删除的功能流,因此您可以从scan调用它们并传递状态。
@Injectable()
export class MyService {
public items: Observable<any>;
private operationStream: Subject<any>;
constructor() {
this.operationStream = Subject.create();
this.items = this.operationStream
// This may look strange, but if you don't start with a function, scan will not run....so we seed it with an operation that does nothing.
.startWith(items => items)
// For every operation that comes down the line, invoke it and pass it the state, and get the new state.
.scan((state, operation:Function) => operation(state), [])
.publishReplay(1).refCount();
this.items.subscribe(x => {
console.log('ITEMS CHANGED TO:', x);
})
}
public add(itemToAdd) {
// create a function which takes state as param, returns new state with itemToAdd appended
let fn = items => items.concat(itemToAdd);
this.operationStream.next(fn);
}
public remove(itemToRemove) {
// create a function which takes state as param, returns new array with itemToRemove filtered out
let fn = items => items.filter(item => item !== itemToRemove);
this.operationStream.next(fn);
}
}
最佳答案
您可以在此处参考SO问题:How to manage state without using Subject or imperative manipulation in a simple RxJS example?。它处理与您的问题相同的问题,即两个流对一个对象执行操作。
其中一种技术是使用scan
运算符和在scan
中保存的状态下进行操作的操作流,但是无论如何都要看一下链接,它具有很强的形成性。这应该使您可以编写一些代码。如果该代码无法按照您想要的方式工作,则可以返回并在此处与示例代码一起再次提问。
关于javascript - 如何在不完成添加序列的情况下从rxjs创建数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36671631/