【问题标题】:Webservice call twice using dispatch and subscribe Angular 9使用分派和订阅 Angular 9 两次 Web 服务调用
【发布时间】:2021-03-23 14:42:27
【问题描述】:

我不明白为什么我的创建帐户 api 被调用了两次。当我删除构造函数部分时,api会被调用一次,但我需要让我的帐户创建成功。

当我处于以下配置时,我有两次调用网络服务:

public onSubmit() {
    this.submitted = true;
    // stop here if form is invalid
    if (this.registerForm.invalid) {
      return;
    }
    this.store.dispatch(
      userAction.userCreateRequest({
        data: this.registerForm.value,
      })
    );
  }

在我的constructor 中,我正在寻找成功:

constructor(
    private store: Store<fromRoot.State>,
    private formBuilder: FormBuilder,
    private route: ActivatedRoute,
    private userEffects: UserEffects,
    private modalService: NgbModal,
    private sanitizer: DomSanitizer,
    private userService: UserService ) {
  this.loading$ = store.select(fromRoot.getUserLoading);
  this.userEffects.create$
  .pipe(ofType(UserTypes.USER_CREATE_SUCCESS))
  .subscribe((res) => {
    console.log("SUCCESSS TEST");
  });
}

effect.ts 具有以下定义:

create$ = createEffect(() =>
  this.actions$.pipe(
    ofType(UserTypes.USER_CREATE_REQUEST),
    exhaustMap((action) => {
      const { data } = action;
      return this.userService.create(data as UserActions.UserInfosData).pipe(
        map((user) => UserActions.userCreateSuccess({ user })),
        catchError((error) =>
          of(UserActions.userCreateFailure({ error }))
        )
      );
    })
  )
);

action.ts:

// create User
export const userCreateRequest = createAction(
  UserTypes.USER_CREATE_REQUEST,
  props<{ data: UserInfosData }>()
);
export const userCreateSuccess = createAction(
  UserTypes.USER_CREATE_SUCCESS,
  props<{ user: any }>()
);
export const userCreateFailure = createAction(
  UserTypes.USER_CREATE_FAILURE,
  props<{ error: any }>()
);

【问题讨论】:

    标签: angular rxjs angular9 subscribe dispatch


    【解决方案1】:

    我有我的答案(请对 Angular 初学者比 Kvetis 更宽容):

    我必须在构造函数中导入操作并订阅成功操作:

    constructor(
        private store: Store<fromRoot.State>,
        private formBuilder: FormBuilder,
        private route: ActivatedRoute,
        private modalService: NgbModal,
        private userService: UserService,
        private actions$: Actions,
      ) {
        this.loading$ = store.select(fromRoot.getUserLoading);
        this.specificDiets$ = store.select(fromRoot.getAppSpecificDiets);
        // this.foods$ = store.select(fromRoot.getAppFoods);
        this.foodGroups$ = store.select(fromRoot.getAppFoodGroups);
        this.physicalActivities$ = store.select(fromRoot.getAppPhysicalActivities);
        this.foodHabits$ = store.select(fromRoot.getAppFoodHabits);
        this.actions$.pipe(ofType(UserTypes.USER_CREATE_SUCCESS))
          .subscribe((res) => {
            console.log("SUCCESSS");
            // this.open(this.alertModal, 'modal-custom alert-modal');
          });
        this.vitrineProducts$ = store.select(fromRoot.getAppVitrineProducts);
      }
    

    【讨论】:

      【解决方案2】:

      你。应该。不是。订阅。到。效果。

      说真的。

      如果您需要在 USER_CREATE_SUCCESS 上完成某些操作,请在 create$ 效果、另一个效果或您的减速器中完成。


      在你的回答中

      this.actions$.pipe(ofType(UserTypes.USER_CREATE_SUCCESS))
        .subscribe((res) => {
          console.log("SUCCESSS");
          // this.open(this.alertModal, 'modal-custom alert-modal');
        });
      

      应该进入效果(至少如果可能的话我会把它放在那里)以保持清洁。如果不可能,您可以将其留在组件中。


      基本是效果会自动订阅(在模块中注册它们时)并且不应该在其他任何地方订阅它们,因为这会导致您的问题。正如您已经发现的那样,您可以使用监听分派的动作,因为动作是效果的通信方式。

      【讨论】:

      • “说真的”谢谢,但我不明白你的回答。这是我的 reducer.ts:on(UserActions.userCreateSuccess, (state, { user }) =&gt; ({ ...state, loading: false, user, error: null, })),
      • 根据您的回答扩展了答案。
      猜你喜欢
      • 1970-01-01
      • 2018-08-18
      • 2017-04-19
      • 2019-07-14
      • 1970-01-01
      • 1970-01-01
      • 2020-10-11
      • 2020-06-17
      • 2018-10-01
      相关资源
      最近更新 更多