Всякий раз, когда вы работаете с наблюдаемыми каналами, как следует из названия, все выдаваемые значения передаются в определенный канал (смотрите его как реальный канал), поэтому вы можете выполнять любые операции, изменять значение, изменение источника излучения и многие другие сложные сценарии ios.
Тем не менее, когда вы создаете настраиваемый канал (или оператор), вы можете либо напрямую определить его как канал ...
const myPipe = pipe(
switchMap(emmitedValue => of(`${emmitedValue} How are you?`))
);
или вы можете определить его как функцию, которая возвращает канал ...
const myPipe2 = optionalMessage => pipe(
switchMap((emmitedValue) => of(`${emmitedValue} How are you? ${optionalMessage}`))
);
Затем вы можете использовать эти каналы, первый, передав его ссылку (вы все равно получите emmited values там) и второй, вызвав эту функцию, которая возвращает желаемый канал (следовательно, вы можете передать больше параметров, чем только выбранное значение).
of('Biiz').pipe(
map(x => `Hello ${x}!`),
myPipe,
).subscribe(console.log);
of('Biiz').pipe(
map(x => `Hello ${x}!`),
myPipe2(`It's a sunny day ?`),
).subscribe(console.log);
(Вы можете проверить этот пример здесь )
В вашем случае вы должны определить свой собственный оператор, просто получив выданное значение в канале:
private prepareData = pipe(
filter((itemA: IteamA) => {
if (itemA.property) {
this.itemA = itemA;
return true;
} else {
this.someLogic(iteamA);
return false;
}
}),
switchMap(() => this.anotherService.getItemB()),
tap(itemB => {
this.anotherLogic(itemB);
this.someLogic(this.itemA);
})
);
И используйте его, передав ссылку:
this.myService.putItemA()
.pipe(
this.prepareData
).subscribe();
// or
this.myService.getItemA()
.pipe(
this.prepareData
).subscribe();