代码之家  ›  专栏  ›  技术社区  ›  MichelDelpech

使用angular ngrx和firestore,set()方法返回未定义的

  •  0
  • MichelDelpech  · 技术社区  · 7 年前

    我用Angular7,Firestore和ngRx做了一个项目。

    我在写我的特效和 工作不正常。

    使用firestore时 add()方法

    (水龙头仅用于测试)

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

    但是当使用 ,我明白了 未定义

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

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

    所以我的效果是快速得到一个身份证,但他没有被定义。

    为什么这么做 添加() 而不是为了 ?

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

    谢谢你的帮助

    0 回复  |  直到 7 年前
        1
  •  0
  •   digeverything    7 年前

    令人沮丧 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
            );
    }