0

我使用 Angular 7、Firestore 和 ngRx 制作了一个项目。

我正在编写我的效果,而set() 方法无法正常工作。

使用 firestore add() 方法时,它工作正常,因为我得到了 DocumentReference(请参阅点击)

(水龙头仅用于测试目的)

服务.ts

createProduct(data): Observable<any> {
        return from(this.db.collection('slack').add({
            ...data
        })).pipe(
            tap(a => console.log('create: ', a))
            // here I get back a DocumentReference
        );
 }

效果.ts

@Effect()
    createProduct$ = this.actions$.ofType(productsActions.CREATE_PRODUCT)
        .pipe(
            map((action: productsActions.CreateProduct) => action.payload),
            switchMap((product) => {
                return this.productService.createProduct(product)
                    .pipe(
                        map(_product => new productsActions.CreateProductSuccess(_product)),
                        catchError((err => of(new productsActions.CreateProductFail(err))))
                    );
            })
        );

但是当使用set() 方法时,我得到未定义(请参阅点击)

服务.ts

updateProduct(data): Observable<any> {
        return from(this.db.doc(`slack/0aMwkyVWF33PF7qDIvKy`).set({
            ...data,
        })).pipe(
            tap(a => console.log('update: ', a))
            // Here I get undefined
        );
}

效果.ts

@Effect()
    updateProduct$ = this.actions$.ofType(productsActions.UPDATE_PRODUCT)
        .pipe(
            map((action: productsActions.UpdateProduct) => action.payload),
            switchMap((product) => {
                return this.productService.updateProduct(product)
                    .pipe(
                        map(_product => new productsActions.UpdateProductSuccess(_product)),
                        catchError((err => of(new productsActions.UpdateProductFail(err))))
                    );
            })
        );

所以我的效果是想得到一个ID,但他没有定义。

为什么这适用于add()而不适用于set()/update()

这是我的项目:https ://github.com/angulartist/ngrx-firestore-playground/blob/master/src/products/services/products.service.ts

感谢您的帮助

4

1 回答 1

0

令人沮丧set()的是,它没有返回对文档的引用。因此,在您的服务中,一旦您完成了set(),您就可以通过管道传输流并执行映射,这样您就可以获得对您执行的文档的引用set()。然后你可以switchMap()get()新更新的文件。

updateProduct(data): Observable<any> {
        return from(this.db.doc(`slack/0aMwkyVWF33PF7qDIvKy`).set({
            ...data,
        })).pipe(
            map(_ => this.db.doc(`slack/0aMwkyVWF33PF7qDIvKy`)),
            switchMap(docRef => fromPromise(docRef.get())),
            tap(a => console.log('update: ', a))
            // Here I get undefined
        );
}
于 2019-03-25T16:10:07.997 回答