Мне нужно выполнить действие после извлечения 2 объектов из моего хранилища (ngrx), поэтому мне нужно, чтобы оба вызова ответили перед выполнением моего действия, например:
const item1$: Observable<Item> = this._store$.select(
ItemStoreSelectors.selectItemById(this.id1)
);
const item2$: Observable<Item> = this._store$.select(
ItemStoreSelectors.selectItemById(this.id2)
);
let item1: Item;
item1$.pipe(take(1)).subscribe((item: Item) => {
item1 = item;
});
let item2: Item;
item2$.pipe(take(1)).subscribe((item: Item) => {
item2 = item;
});
// here, items might not have been initialized
doSomething(item1, item2);
Я попытался найти решение в rxjs с помощью switchMap, mergeMap и т. д., но не смог применить его для своих нужд. Я думаю, что нашел решение, использующее async/await, но я не уверен, что это хорошая практика.
Спасибо за вашу помощь.
или в зависимости от случая... forkJoin.
@MoxxiManagarm посмотрю на это, спасибо, я уже пробовал, я думаю, но не смог заставить это работать с моим делом





Рефакторинг в следующий код:
import { forkJoin } from 'rxjs';
const item1$: Observable<Item> = this._store$.select(
ItemStoreSelectors.selectItemById(this.id1)
);
const item2$: Observable<Item> = this._store$.select(
ItemStoreSelectors.selectItemById(this.id2)
);
forkJoin([item1$.pipe(take(1)), item2$.pipe(take(1))])
.subscribe(([item1,item2])=>doSomething(item1,item2));
спасибо, это выглядит потрясающе, так что, если я правильно понимаю, подписка сработает только тогда, когда оба элемента будут запущены?
Правильно, forkJoin создает наблюдаемую, которая выдает последнее значение своих источников после того, как все они завершены.
combLatest будет запускаться каждый раз, когда один из наблюдаемых пожаров, если это то, что вы хотите, попробуйте это:
item1$: Observable<Item> = this._store$.select(
ItemStoreSelectors.selectItemById(this.id1)
);
item2$: Observable<Item> = this._store$.select(
ItemStoreSelectors.selectItemById(this.id2)
);
result$: Observable<any> = combineLatest(this.item1$, this.item2$, this.doSomething());
спасибо, я посмотрю разницу между CombineLatest и fork. Присоединяйтесь как @Jota. Толедо ответил, но я думаю, что это не полностью отвечает моим потребностям, потому что мне нужна трубка (взять (1))
В качестве альтернативы вы можете использовать withLatestFrom в эффекте. Что-то вроде этого
@Effect()
myAction$ = this.actions$.pipe(
ofType<MyAction>(MyActionTypes.MyAction),
withLatestFrom(this.store.select(mySelector)),
withLatestFrom(this.store.select(myOtherSelector)),
exhaustMap(([[action, item1], item2]) =>
this.myService.myRequest(/*...*/)
.pipe(
map(myResult => new GetResultSuccess(myResult)),
catchError(error => of(new GetResultFailure(error))),
),
),
);
использовать комбинацию последних Learnrxjs.io/operators/combination/combinelatest.html