Как отменить эффект ngrx, если в хранилище уже есть кэшированные данные? - PullRequest
1 голос
/ 06 июня 2019

В моем приложении Angular я хочу прекратить вызывать сервер, используя ProductService с http, если в хранилище уже есть данные.

Это то, что у меня сейчас есть. Я получаю поток из магазина и проверяю, есть ли в магазине продукты. Если в магазине уже есть товары, верните эти данные. В противном случае продолжите поток, получите categoryId, вызовите сервер с помощью ProductService и верните данные.

Правильно ли я делаю эффект?

loadProducts$ = createEffect(
    () => ({ debounce = 300, scheduler = asyncScheduler } = {}) =>
      this.actions$.pipe(
        ofType(ProductActions.LoadProducts),
        debounceTime(debounce, scheduler),
        switchMap(() => this.ProductStore.pipe(select(ProductSelectors.selectAllProducts))),
        switchMap((Products) => {
          if (Products.length != 0) {
            return ProductActions.LoadProductsSuccess({ Products });
          }

          return of(ProductActions.LoadProductsCancelled({ Products }));
        }),
        switchMap(() => this.store.pipe(select(fromRoots.getCategory))),
        switchMap((category) =>
          this.ProductService.getProducts(category.categoryId).pipe(
            map(Products => (ProductActions.LoadProductsSuccess({ Products }))),
            catchError(err => of(ProductActions.LoadProductsFailed(err))
            )
          ))));

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Я обновил эффект в соответствии с предложением Flignats, и теперь он выглядит следующим образом:

  loadProducts$ = createEffect(
    () => ({ debounce = 300, scheduler = asyncScheduler } = {}) =>
      this.actions$.pipe(
        ofType(ProductActions.LoadProducts),
        debounceTime(debounce, scheduler),
        withLatestFrom(
          this.store.select(ProductSelectors.selectAllProducts),
          this.rootState.select(fromRoots.getcategory),
        ),
        switchMap(([action, existingProducts, category]) => {

          if (existingProducts.length > 0) {
            return of(ProductActions.LoadProductsSuccess({ Products: existingProducts }));
          }

          return this.ProductService.getProducts(category.categoryId).pipe(
            map(newProducts => (ProductActions.LoadProductsSuccess({ Products: newProducts }))),
            catchError(err => of(ProductActions.LoadProductsFailed(err)))
          )
        })));
0 голосов
/ 06 июня 2019

Вы можете использовать эффект условия, как этот

@Effect()
    getMemberInfo$: Observable<Action> = this.actions$
    .ofType<memberAction.GetMember>(
        memberAction.MemberActionTypes.GetMember
    )
    .switchMap((action) => {
        let obs;
        this.store.select(getMember).take(1).subscribe(res => {
            const existsInStore = res.length > 0;
            if (existsInStore) {
              let member: IMember = res.find(x => x.id === action.payload);
              member = {
                  ...member
              };

              obs = new memberAction.GeMemberSuccess(member);
            } else {
              obs = this.memberService.getMember(action.payload)
                .map(member => {
                    return new memberAction.GeMemberSuccess(member);
                });
            }

        });
        return obs;
    });
...