Angular 6 RxJS6 Тип 'void' нельзя назначить типу 'ObservableInput <{}>' - PullRequest
0 голосов
/ 05 апреля 2019

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

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<{}>'.

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

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

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

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

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

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

и в методе (изменен; удален this.error) Пожалуйста, руководство, как добавить код для errorMessage:

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

  this.reportData = result;


        }
    }))
    .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);
    }

}

Ответы [ 3 ]

1 голос
/ 06 апреля 2019

Я думаю, что проблема в том, что вы пропускаете оператор return в операторе map.

import { of } from 'rxjs';

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

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

1 голос
/ 05 апреля 2019

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

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

 public GetProjectReportsData(data: any): Observable<any> {
        return this.http.post(this.GetProjectReportDataUrl, data)
            .pipe(
               map(res => <any[]>res),
               catchError(this.handleError)
             );
    }
0 голосов
/ 06 апреля 2019

Возврат наблюдается от catchError:

import { of } from 'rxjs';

...
catchError(error => of(this.ErrorMessage('Unable to load workbook ' + error.toString()))
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...