AngularFire2承诺进入可观察类型的问题

时间:2018-08-10 03:02:43

标签: rxjs angularfire2 rxjs6

我正在尝试将angularfire2的诺言映射到类型化的可观察对象中。这是我的课程:

export class RestService<T extends Entity> {

    constructor(
        protected afAuth: AngularFireAuth,
        protected store: AngularFirestore,
        protected readonly collectionName: string) {

        this.collection = store.collection<T>(collectionName);

    }

    protected collection: AngularFirestoreCollection<any>;

    all(): Observable<Array<T>> {
        return from(this.collection
            .snapshotChanges()
            .pipe(
                map(action => mapActionArray(action)),
                catchError((error: any) => {
                    throw new ApiError(error);
                })
            )
        );
    }


}

/**
 * Override Firestore errors with common app errors.
 * @param error - Firestore error
 */
function mapError(error: any): Observable<ApiError> {
    return throwError(new ApiError(error));
}

function mapDocument<T extends Entity>(doc: DocumentSnapshot<any>): T {
    return {
        id: doc.id,
        ...doc.data()
    };
}

注意all()方法,我想在catchError中映射任何错误,但是问题是我得到了这种类型的错误:

  

TS2322:类型'Observable <{} []>'不可分配为类型'Observable'。类型'{} []'不可分配给类型'T []'。不能将类型'{}'分配给类型'T'。

我通过将返回类型更改为Observable <{} |来修复它。 Array>,但是每当我使用此服务时,都需要使用相同的类型,但我觉得不好。 我该如何解决?我希望能够键入我的服务,并事先将错误映射到适当的CustomError对象(这包括将代码映射到消息)。

顺便说一句,我也尝试过使用RXJS的throwError。

谢谢。

1 个答案:

答案 0 :(得分:0)

回答我自己的问题,我必须在map运算符之前使用catchError。所以:

  all(): Observable<Array<T>> {
    return from(this.collection
        .snapshotChanges()
        .pipe(
            map(action => mapActionArray(action)),
            catchError((error: any) => {
                throw new ApiError(error);
            })
        )
    );
}

将成为

  all(): Observable<Array<T>> {
    return from(this.collection
        .snapshotChanges()             
        .pipe(
            catchError((error: any) => {
                throw new ApiError(error);
            }),
            map(action => mapActionArray(action))                
        )
    );
}

希望有帮助