我使用Angular 7,Firestore和ngRx创建了一个项目。
我正在编写我的效果,并且set()方法无法正常工作。
当使用firestore add()方法时,它工作正常,因为我得到一个DocumentReference(见tap)
(水龙头仅用于测试目的)
service.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
);
}
effects.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()方法时,我得到了undefined(参见tap)
service.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
);
}
effects.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()?
谢谢你的帮忙
令人沮丧的是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
);
}