Объединение наблюдаемого и принятие мер, когда все субъекты выдали значение

Я хотел бы объединить наблюдаемые в один, а затем подписаться, когда ВСЕ субъекты выдали значение. Пока что пробовал Observable.merge и Observable.zip

public A:Subject<any> = new Subject();
public B:Subject<any> = new Subject();
public C:Subject<any> = new Subject();
public D:Subject<any> = new Subject();
public Complete:Subject<any> = new Subject();

A.next(true);
B.next(true);
C.next(true);
D.next(true);

Observable.zip(A,B,C,D).subscribe(res=>{Complete.next(true)})

Но если я сделаю это выше, я думаю, что подписчик будет слушать любой из A, B, C или D, при условии выдачи значения, а не ВСЕ. Каким будет способ подождать, пока A, B, C и D не выдадут значение?


person PowerLove    schedule 29.08.2017    source источник


Ответы (1)


Вы можете использовать Observable.forkJoin, который ждет, пока все исходные Observables не выдадут хотя бы одно значение и все они не будут завершены. Но поскольку вы используете Subjects, очень вероятно, что они не завершаются, поэтому использование .zip() имеет смысл.

Оператор zip() выдает Xth только тогда, когда все источники испускают X значений. В вашем случае zip() будет генерировать один элемент только тогда, когда все A, B, C и D испускают хотя бы один элемент.

Однако, если вы используете merge, он будет генерировать каждый раз, когда любой из A, B, C и D испускает элемент.

Живая демонстрация: http://jsbin.com/hihutoj/8/edit?js,output

person martin    schedule 29.08.2017
comment
Не могли бы вы предоставить мне плункер, если можно? потому что, когда я пробую именно этот код в своем коде, оператор zip ничего не выдает .... - person PowerLove; 29.08.2017
comment
Конечно, сначала нужно подписаться, а потом позвонить next()s :) - person martin; 29.08.2017
comment
Ух, это сводит меня с ума. Я не знаю, почему этот же код не работает в моем проекте Angular2 ... У меня точно такая же вещь в моих сервисах, и я вызываю сервис, но zip ничего не выдает :( - person PowerLove; 29.08.2017