Тип Angular 6 RxJS6 ‘void’ не может быть присвоен типу ‘ObservableInput’

#angular #observable #rxjs6

#угловой #наблюдаемый #rxjs6

Вопрос:

Я конвертирую свой код для использования синтаксиса RxJS6 для использования канала и карты, но я получаю ошибку.

 error TS2345: Argument of type '(error: any) => void' is not assignable to parameter of type '(err:
any, caught: Observable<void>) => ObservableInput<{}>'.
  Type 'void' is not assignable to type 'ObservableInput<{}>'.
  

Существующий код работает нормально, но у меня проблема в том, что перед возвращением результата вызываются другие методы. Итак, насколько я понимаю, используя канал и карту
решит эту проблему.
Вот код, который у меня был изначально:

 this._reportingService.GetProjectReportsData(data).subscribe(result => {
    if (result != null) {
        this.reportData = resu<
    }

}, error => {
    this.ErrorMessage('Unable to load workbook '   error.toString());
    this._reportingService.isLoading = false;
});
  

Вот код, который я пытаюсь преобразовать в использование канала и карты:

Я импортировал вместе с остальным импортом

 import { Observable, of, throwError } from 'rxjs';
import { map, catchError, retry } from 'rxjs/operators';
  

и в методе (модифицирован; удалена эта ошибка) Пожалуйста, укажите, как добавить код для сообщения об ошибке:

 this._reportingService.GetProjectReportsData(data).pipe(
    map(result => {
        if (result != null) {

  this.reportData = resu<


        }
    }))
    .subscribe();
  

И мой класс обслуживания:

 import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';

import { map, tap, catchError } from 'rxjs/operators';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';


@Injectable({
    providedIn: 'root'
})
export class ReportingService extends BehaviorSubject<any[]>{

    constructor(private http: HttpClient) {

    super(null);
    }

    public GetProjectReportsData(data: any): Observable<any> {
        return this.http.post(this.GetProjectReportDataUrl, data)
            .pipe(map(res => <any[]>res))
            .pipe(catchError(this.handleError));
    }
    private handleError(error: any) {

        let errMsg = (error.message) ? error.message :
            error.status ? `${error.status} - ${error.statusText}` : 'Server error';
        return Observable.throw(errMsg);
    }

}
  

Ответ №1:

Я думаю, проблема связана с тем, что вам не хватает оператора return в map операторе.

 import { of } from 'rxjs';

this._reportingService.GetProjectReportsData(data).pipe(
    map(result => {
        if (result != null) {
           return this.reportData = resu<
        }
        return of(null);
    }))
    .subscribe();
  

Также не уверен, почему вы используете эту проверку (результат != null). Просто будьте осторожны там.

Ответ №2:

По моему мнению, проблема заключается в двойной цепочке каналов.

попробуйте вот так.

  public GetProjectReportsData(data: any): Observable<any> {
        return this.http.post(this.GetProjectReportDataUrl, data)
            .pipe(
               map(res => <any[]>res),
               catchError(this.handleError)
             );
    }
  

Ответ №3:

Возвращает наблюдаемый из catchError :

 import { of } from 'rxjs';

...
catchError(error => of(this.ErrorMessage('Unable to load workbook '   error.toString()))
...
  

Комментарии:

1. Не могли бы вы, пожалуйста, предложить весь блок? Не получается правильный синтаксис … получаем количество закорючек.

2. изменен код и удалено это. Сообщение об ошибке. Код компилируется нормально. Но все равно нужно знать, как добавить код для этого. Сообщение об ошибке