rxjs / Observable:获取第一个流后运行一次函数(连续可观察)

时间:2016-08-22 07:02:24

标签: angular rxjs observable angularfire2

首先,对于长标题感到抱歉。

我正在尝试使用来自forEachangularfire2订阅一组连续流,但我还想在确认第一组数据进入后运行一个函数:

this.people.forEach((person) => {
    person.items = this.database.list('/items' + person.key);
    person.items.subscribe((data) => {person.itemsList = data});
});

myIntendedFunction();

有没有办法放置myIntendedFunction()

  1. 在收到data的第一个person信息流后运行,
  2. 它只运行一次?

3 个答案:

答案 0 :(得分:4)

如果您不希望第一次请求发生两次,这样做会有点复杂:

const connectables: ConnectableObservable<any>[] = [];

this.people.forEach(person => {
    person.items = this.database.list('/items' + person.key);
    const connectable = person.items.publish();
    connectables.push(connectable);
    connectable.subscribe((data) => {person.itemsList = data});
});

Observable.zip(...connectables).take(1).subscribe(myIntendedFunction);

connectables.forEach(c => c.connect());

这里发生的是:publish()的效果基本上是您可以多次订阅相同的数据流。此外,在您致电connect()之前,我们不会调用订阅功能。 如果我们使用person.items.share()作为person.items.publish().connect()的糖,它会立即发出请求,而我们的应用程序可能因种族条件而错误。

zip()等待每个传递的observable发出一个项目并一次性将这些项目作为数组发出。我们只希望在第一组项目上进行此操作,因此我们只需take(1)

答案 1 :(得分:0)

这并不完全是你想要实现的目标。 据我所知,你收到第一个人后试图打电话给“myIntendedFunction”。 您可以多次订阅您的o​​bservable(订阅订单很重要)并使用first()运算符只取第一个值然后取消订阅。

this.people.subscribe((person) => {
    person.items= this.database.list('/items');
    person.items.subscribe((data) => {person.itemsList = data});
});

this.people.first().subscribe(myIntendedFunction);

答案 2 :(得分:0)

在firebase列表中使用.first()的{​​{1}}运算符将获得列表中的初始值。如果没有此运算符,您的函数将被多次调用并可能导致浏览器崩溃。 import 'rxjs/add/operator/first'运算符 .toPromise()会将获得的列表observable转换为promise。您可以使用import 'rxjs/add/operator/toPromise'使用promise来运行所需的功能。

.then()