Поскольку у вас так много значений, которые необходимо отслеживать, я бы действительно рекомендовал вам использовать Subject
.Это точная цель Subject
- сохранить значения.Например, в вашем случае вы можете использовать BehaviourSubject
.
. Сначала укажите необходимую тему:
let call1Subject = new BehaviourSubject<Foo[]>(null);
let call2Subject = new BehaviourSubject<FooTwo[]>(null);
let call3Subject = new BehaviourSubject<FooThree[]>(null);
Теперь вы можете обновить значения BehaviourSubject
, используя .next
и вы можете получить его самое текущее значение через .value()
:
return this.callOne()
.flatMap(foo => {
// foo filter logic here
call1Subject.next(foo);
return this.callTwo(foo[0].id);
})
.flatMap(fooTwo => {
// fooTwo filter logic here
call2Subject.next(fooTwo);
return this.callThree(fooTwo[0].id);
})
.flatMap(fooThree => {
call3Subject.next(fooThree);
let fooTwo = call2Subject.value();
return this.callFour(fooTwo[0].id, fooThree[0]);
})
.map(bar => {
// additional processing here
let foo = call1Subject.value();
let fooTwo = call2Subject.value();
let fooThree = call3Subject.value();
return ({foo, fooTwo, fooThree, bar});
});
Код выглядит намного аккуратнее, и у вас очень четкий контекст.Способ .map()
тоже работает;но ваш код может легко раздуться и его сложнее управлять.