首页 > 解决方案 > 可以选择使用 Toast 重试操作不起作用

问题描述

BiographyUpdate我有一个应用程序,如果某个操作失败(当用户关闭 toast 时,如果他们接受,它应该重试该操作:

@Effect()
  public BiographyUpdate: Observable<any> = this._actions.pipe(
    ofType(AuthActionTypes.BIOGRAPHY_UPDATE),
    map((action: BiographyUpdate) => action.payload),
    switchMap(biography => this._profile.updateBiography(`${Environment.Endpoint}/users/update`, biography)
      .map(() => new BiographyUpdateSuccess())
      .catch(() => Observable.of(new BiographyUpdateFailure(biography)))
    )
  );

  @Effect({ dispatch: false })
  public BiographyUpdateFailure: Observable<any> = this._actions.pipe(
    ofType(AuthActionTypes.BIOGRAPHY_UPDATE_FAILURE),
    map((action: BiographyUpdateFailure) => action.payload),
    tap(payload => {
      const toast = this._toast.create({
        message: "Update failed.",
        ...ToastDefaults,
        duration: 3000,
        closeButtonText: 'Retry'
      });
      toast.onDidDismiss(() => new BiographyUpdate(payload));
      toast.present();
    })
  );

由于该动作是通过 UI 的回调调用的,我认为这种方式会起作用,但该动作再也不会被调用。有什么建议么?

标签: ionic3rxjsngrxngrx-effects

解决方案


想通了,我需要调度动作。这是我更新的失败操作:

为清楚起见,我仅在用户关闭 Toast 时才发送操作,而不是在自动关闭时发送操作。Ionic 没有记录这一点,但这是可能的。

@Effect({ dispatch: false })
  public BiographyUpdateFailure: Observable<any> = this._actions.pipe(
    ofType(AuthActionTypes.BIOGRAPHY_UPDATE_FAILURE),
    map((action: BiographyUpdateFailure) => action.payload),
    tap(payload => {
      const toast = this._toast.create({
        message: "Update failed.",
        ...ToastDefaults,
        duration: 3000,
        closeButtonText: 'Retry'
      });
      toast.onDidDismiss((data, role) => { 
          if (role === 'close') 
              return this._store.dispatch(new BiographyUpdate(payload)); 
      });
      toast.present();
    })
  );

推荐阅读