【问题标题】:AngularFire2 promises into Observable type IssuesAngularFire2 承诺进入 Observable 类型问题
【发布时间】:2019-01-17 14:04:41
【问题描述】:

我正在尝试将 angularfire2 的承诺映射到类型化的 observables。这是我的课:

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 来修复它,但是每当我使用此服务时都需要使用相同的类型,我觉得它不好。 我该如何解决这个问题?我希望能够键入我的服务并事先将错误映射到适当的 CustomError 对象(这包括将代码映射到消息)。

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

提前致谢。

【问题讨论】:

    标签: rxjs angularfire2 rxjs6


    【解决方案1】:

    回答我自己的问题,我必须在 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))                
            )
        );
    }
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2018-10-26
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      相关资源
      最近更新 更多