Angular 2 — Проблема с картой переключения RxJS

Я пытаюсь иметь бесконечный раздел прокрутки в своем приложении. Для этого я использую этот компонент для обработки событий прокрутки и т. д. . Когда прокрутка достигает нижней части div, я вызываю функцию для получения дополнительных данных. Все идет нормально.

Чтобы сделать эту функцию более эффективной, я пытаюсь подождать несколько секунд перед выполнением вызова, а также убедиться, что данные обрабатываются правильно. Для этого я просмотрел пример, показанный на Веб-сайт Angular, демонстрирующий поиск в Википедии.

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

Type 'void' is not assignable to type 'ObservableInput<{}>'

Это пример моего кода:

private scrollEndActive: Subject<boolean> = new Subject<boolean>();

ngOnInit() {
    ...
    this.scrollEndActive
        .debounceTime(1000)
        .distinctUntilChanged()
        .switchMap(data => {
            // ... get data from server
        })
}

...

// event to trigger call to server
scrollEnd() {
    this.scrollEndActive.next(true);
}

С приведенным выше кодом я получаю следующее: введите здесь описание изображения

Из проведенного мной исследования кажется, что проблема связана с тем, что нужно возвращать Observable (Тип 'void' не может быть присвоен типу 'ObservableInput‹{}›'). Но в моем случае я не уверен, в чем проблема.

Я работаю с:

  • Угловой 4.0.1
  • Типскрипт 2.2.2
  • RxJS 5.2.0

person Daniel Grima    schedule 18.05.2017    source источник
comment
Вы должны вернуть Observable В чем проблема?   -  person yurzui    schedule 18.05.2017
comment
Я не уверен, что мне нужно вернуть до этого момента... весь код, который, как мне кажется, будет воздействовать на Subject при его запуске, поэтому я не понимаю, где я должен возвращать Observable   -  person Daniel Grima    schedule 18.05.2017
comment
.switchMap(data => { return Observable.of(null) }) Не забывайте import 'rxjs/add/observable/of'; Но это просто заглушка. Я предполагаю, что вы хотите получить реальный наблюдаемый   -  person yurzui    schedule 18.05.2017
comment
Эх, я чувствую себя немного тупым... некоторое время пробовал что-то подобное... должно быть, что-то упустил -_- большое спасибо! Я думаю, что мне удастся заставить его работать - возможно, мне понадобится несколько кружек кофе ... еще раз спасибо!   -  person Daniel Grima    schedule 18.05.2017
comment
Интересно, какой смысл использовать .switchMap(data => { return Observable.of(null) }). Похоже, вам вообще не нужно использовать switchMap.   -  person martin    schedule 18.05.2017
comment
В моем случае я не возвращаюсь Observable.of(null) Я предполагаю, что yurzui просто показывал пример   -  person Daniel Grima    schedule 18.05.2017
comment
наверное что-то вроде .switchMap(data => fetch('/api/getAnswer?data=${data}')   -  person Brandon    schedule 18.05.2017


Ответы (2)


По умолчанию стрелочная функция () => {...} имеет тип возвращаемого значения void, если вы что-то не вернете.

Если вы хотите использовать switchMap, чтобы ничего не возвращать, вы можете сделать, как сказал yurzui в комментариях, return Observable.empty().

При этом, если вы возвращаете наблюдаемое значение null в своем switchMap, это означает, что вам не нужен switchMap, и вы можете напрямую использовать оператор do, который выполняет действие без изменения возвращаемых данных. Или mergeMap, который позволяет вам вернуть новый Observable из данных, которые вы получили из исходного.

person Supamiu    schedule 18.05.2017
comment
Вместо Observable.of(null) вам может понадобиться Observable.empty() - person jayphelps; 02.03.2018

Я работаю с:

  • Угловой 5.1.0
  • Типскрипт 2.5.3
  • RxJS 5.5.6

У меня такая же проблема. Я исправил добавление возвращаемого значения в switchMap, потому что вы не можете вернуть значение undefined или null. Но если вы не можете вернуть Observable, вы можете вернуть пустой массив.

Мне нужно было решить цепочку Observable, и я решил так:

resolve(): Observable<any> {
    return firstObservableFunc()
    .map(res => res)
    .switchMap(result => (result && result.value === 'OK') ? secondObservableFunc() : []);                        
}
person Flavio Vallone    schedule 11.04.2018