RxJS 6 - Angular 7 - Правильно отменяет текущий HTTP-запрос от субъекта - PullRequest
0 голосов
/ 26 марта 2019

Привет. У меня проблемы с подпиской на тему и поисковым вызовом. Я хочу отменить предыдущий звонок в пользу текущего. Я выполнил поиск по предыдущим темам, но не смог найти ответ.

Я знаю, что должен использовать switchMap (), но у меня ничего не получилось. Все звонки продолжаются независимо от состояния. Я думаю, что это должно быть связано с тем, как я настроил вещи, потому что я не возвращаю ответ, который я устанавливаю. Так что нет единой наблюдаемой ссылки ..?

Вся помощь приветствуется!

Пожалуйста, смотрите код ниже:

ngOnInit() {
// I subscribe to the Subject Observable here
this._searchService.quickSearch$
  .pipe(
    debounceTime(1000),
    distinctUntilChanged()
  )
  .subscribe(
    // when value has changed I call runSearch
    (queryString) => {this.runSearch(queryString);
  }
  );
}

runSearch:

runSearch(searchString: any) {
this.quickSearch.runSearch(searchString).pipe(
   //Not working as expected
    switchMap(() => {
      console.log('switchMap has bee fired');
      return this.quickSearch.runSearch(searchString);
    })
).subscribe(
    (response) => {
    //  set the two way bind here
    this.apiResponse = response;
  },
  (error) => {
    console.log('ERROR!!!');
  },
  () => {
    // this is fired when the observable is closed
    console.log('I have been unsubscribed');
  }
  );
 }

служба быстрого поиска:

  runSearch(search: string): Observable<QuickSearch[]> {

   ...

    return this.http.get<QuickSearch[]>(this.api.url, { params: param, headers: header })
      .pipe(
        map((data: any) => {
             return data.map((item: any[]) => this.adapter.adapt(item));
        }
        ),
        catchError(error => error)
      );

  }

Спасибо

ОБНОВЛЕНИЕ

Я до сих пор не нашел ответа на этот вопрос. Я собираюсь перефразировать это.

У меня есть 5 частей к этому:

    Input box ([])-> 
    rxjs-Subject (input-text)-> 
    runSearch(input-text) -> [ handles response ] 
    _service.runSearch(input-text) ->
    http().get(input-text) => response

при изменении поля ввода вызывается запуск поиска, в котором служба поиска тоже подписана, это не возвращает

1 Ответ

2 голосов
/ 26 марта 2019

Проблема в том, что каждый раз, когда this._searchService.quickSearch$ генерирует вызов, вы вызываете метод runSearch, который каждый раз создает новую цепочку, поэтому даже если у вас есть switchMap, это не имеет значения.

Вместо этого вам следуетположить switchMap в первую цепочку:

this._searchService.quickSearch$
  .pipe(
    debounceTime(1000),
    distinctUntilChanged(),
    switchMap((searchString) => this.quickSearch.runSearch(searchString)),
  ).subscribe(
    (response) => {
      this.apiResponse = response;
    },
    ...
  );
...