我试图找出一种执行以下操作的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/

10-11 14:22