Как вы отмените предыдущую наблюдаемую с задержкой? - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть следующий бит кода, который устанавливает состояние внутри магазина:

  public savePref(setting: SomeSetting): void {
    this.update({
      data: {
        saveSuccess: null
      },
      loading: true,
      error: null
    });

    this.apiService
    .savePrefs(setting)
    .pipe(
      switchMap(
        (changeResponsePrefs) => {
          const changedPrefs =
            changeResponsePrefs.events[0].data.output.preferences;
          const meta = this.stateValue.data.meta;
          const prefs = this.stateValue.data.prefs;

          return forkJoin([of(meta), of(prefs), of(changedPrefs)]);
        }
      ),
      map(
        ([meta, oldPrefs, newPrefs]) => {
          const updatedPrefs = merge(oldPrefs, newPrefs);

          return {
              ...updatedPrefs
          };
        }
      ),
      tap(data => {
        this.update({
          data: {
            ...data,
            saveSuccess: {
              success: true
            }
          },
          loading: false
        });
      }),
      catchError(error => {
        this.update({
          data: {
            saveSuccess: {
              success: false
            }
          },
          loading: false,
          error: {
            ...error,
            savePrefsError: true
          }
        });

        return EMPTY;
      }),
      take(1)
    )
    .pipe(
      delay(10000), // issue is here
      finalize(() =>
        this.update({
          data: { saveSuccess: null }
        })
      ),
      take(1)
    )
    .subscribe();
  }

В зависимости от того, успешно ли выполняется сохранение, я устанавливаю saveSuccess - я использую это значениев другом месте для отображения предупреждения с сообщением об ошибке или об успешном завершении.

Проблема заключается в том, что если вы активируете эту функцию, сообщение об успехе / ошибке будет отображаться в течение 10 секунд (как и ожидалось);но если во время этого ожидания вы перейдете к сохранению другого предпочтения и снова запустите savePref(), сообщение об успехе / ошибке исчезнет после истечения предыдущих 10 секунд.Я пытаюсь выяснить, как начинать новую задержку при каждом запуске этой функции - эффективно отменяя предыдущую задержку выбросов.

Я подписываюсь на saveSuccess примерно так:

public get saveSuccess$(): Observable<any> {
  return this.state$.pipe(map(state => state.data.saveSuccess));
}

где я использую его как часть async трубы в шаблоне.

Возможно ли что-то подобное?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...