2016-11-18 7 views
1

У меня есть простой метод поиска с отклонением RXJSметод изменения не вызван после ошибки в обслуживании Угловой 2

вот так.

this.searchTerm.valueChanges 
     .debounceTime(this._debounceDelay, this._scheduler) 
     .distinctUntilChanged() 
     .filter(this.filterForBlank.bind(this)) 
     .filter(this.filterForLength.bind(this)) 
     .switchMap(term => this.searchService.serchBy(term)) 
     .subscribe((data) => { 
     // do something 
     }, (err) => { 
      // show error on UI 
     }); 




private filterForLength(term: string) { 
    return (term.trim().length > 2); 
    } 

    private filterForBlank(term: string) { 
    if (isEmpty(term)) { 
       return false; 
    } 
    return true; 
    } 

но если есть ошибка, например, я изменил URL к неправильному ... эта функция изменения не ударяя снова. даже после изменения значения

Я думаю, что мне нужно убить наблюдаемое, если есть ошибка. Но точно не делайте этого.

ответ

0

Ваши объяснения практически правы. Если вы допустите наблюдаемую ошибку, не заметив ошибку, она, вероятно, больше не будет работать. Что вам нужно сделать, так это использовать оператор catch, чтобы ловить ошибки и обрабатывать их, чтобы они не могли «убить» наблюдаемые.

Это может выглядеть следующим образом:

this.searchTerm.valueChanges 
    .debounceTime(this._debounceDelay, this._scheduler) 
    .distinctUntilChanged() 
    .filter(this.filterForBlank.bind(this)) 
    .filter(this.filterForLength.bind(this)) 
    .switchMap(term => this.searchService.serchBy(term)) 
    .catch(errors => { 
    return Rx.Observable.empty(); 
    }); 
    .subscribe((data) => { 
    // do something 
    }); 

Теперь, если вы бэкенд вызов не выполняется, то он будет корректно обрабатывается пунктом улова и возвращает новое пустое значение. Вы можете использовать это пустое значение, чтобы очистить все данные, которые вы показываете, когда это удается. Если он работает, он просто пропустит предложение catch.

EDIT: Вы правы. Это не будет работать. В связи с тем, что, если наблюдаемые ошибки цепочки, вся цепочка нарушена. Чтобы исправить это, вам нужно сделать, это:

this.searchTerm.valueChanges 
    .debounceTime(this._debounceDelay, this._scheduler) 
    .distinctUntilChanged() 
    .filter(this.filterForBlank.bind(this)) 
    .filter(this.filterForLength.bind(this)) 
    .switchMap(term => 
       this.searchService.serchBy(term) 
        .catch(errors => { 
          // show error on ui 
          return Rx.Observable.empty() 
        })) 
    .subscribe((data) => { 
    // do something 
    }); 

Перемещая заявление поймать внутри switchMap, это будет наблюдаемая цепью внутри этого switchMap, что сломается. Однако исходная цепочка, начиная с «this.searchTerm.valueChanges», не сломается и не останется в живых.

Приношу свои извинения за неправильный ответ.

+0

нерабочий !! он собирается ловить, но после изменения стоимости снова он не вызывает API –