【问题标题】:How to create an Observable<any[]>?如何创建一个 Observable<any[]>?
【发布时间】:2017-06-16 20:51:57
【问题描述】:

我需要联系Observable&lt;any[]&gt;。我目前有一个看起来像这样的 observable:

        const eventsWatcher = new Observable(observer => {
            try {
                this.socket.on('calendar-events', data => {
                    observer.next(data);
                });
            }
            catch (err) {
                observer.error(err);
            }
        })

基本上我需要从这个 Observable 中获取值并创建一个新的,它是现有 observable 发出的值的数组。

我试过了

        const arr = [];
        const eventsWatcher = new Observable(observer => {
            try {
                this.socket.on('calendar-events', data => {
                    observer.next(data);
                });
            }
            catch (err) {
                observer.error(err);
            }
        }).subscribe(data => {
            arr.push(data);
        });
        return Observable.from(arr);

但这会返回 ArrayObservable 而不是 Observable&lt;any[]&gt;

对不起,如果我描述得不好,但是 rxjs 真的很难。

【问题讨论】:

  • 您是否需要新的 observable 为每个新项目发出一个数组?或者您只是希望它在 eventsWatcher 可观察对象完成后发出一个数组?
  • 我真正需要的是每次现有的 observable 发出一个新值时,新的 observable 发出一个数组。发出的数组需要包含新值以及所有以前发出的值。
  • eventsWatcher 发出 1,2,3。选项 A:新的 observable 发出 [1]、[1,2]、[1,2,3]。选项 B:新的 observable 只发出 [1,2,3]
  • 选项 A 是我正在寻找的。​​span>
  • 添加了答案。不要放弃 Rx :)

标签: javascript typescript socket.io rxjs


【解决方案1】:

使用 scan 运算符:

const yourNewObservable = eventsWatcher
    .scan((acc, newItem) => acc.concat(newItem), []);

【讨论】:

  • 成功了。太感谢了。实际上,我已经在研究 scan 运算符了,但是 rxjs 文档非常密集且技术性很强,以至于我无法弄清楚如何实现它。
  • 不客气!有时从示例中更容易理解。该站点包含每个操作员的一些示例。试试看learnrxjs.io/operators/transformation/scan.html
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
相关资源
最近更新 更多