FireBaseのルックアップ項目から、最初の返品項目からDOCIDを検索してからマージ -- firebase フィールド と rxjs フィールド 関連 問題

Lookup items in firebase then lookup docId from the first returned items then merge












0
vote

問題

日本語

各製品の場所を検索する必要があります。 最初の searchCollection は、 anotherTblDocIs のいずれかを持つオブジェクトの配列をJSON文字列として返します。 FireBase DocIDであるこのJSON文字列では、名前を検索する必要があります。それから私はそれを取り戻す必要があります。

どうすれば適切に達成することができますか?

<事前> <コード> this.firebaseService .searchCollection('product', 'shopId', this.shopId) .pipe( mergeMap((products: any) => { let observableBatch = []; products.map(product => { const docIds = JSON.parse(product['anotherTblDocIs']); docIds.forEach(doc =>{ observableBatch.push(this.firebaseService.readCollectionByDocId('doc', doc ).pipe(map(u => {return { doc, ...u}}))) }); }); return forkJoin(observableBatch); }) ) .subscribe(products => { });
英語

I need to lookup the location for each product. First searchCollection returns array of object with one of the property anotherTblDocIs as a json string. In this json string, which is firebase docId, I need to lookup the name. Then I need to merge it back.

How can I achieve this properly?

this.firebaseService         .searchCollection('product', 'shopId', this.shopId)         .pipe(           mergeMap((products: any) => {             let observableBatch = [];             products.map(product => {               const docIds = JSON.parse(product['anotherTblDocIs']);                              docIds.forEach(doc =>{                 observableBatch.push(this.firebaseService.readCollectionByDocId('doc', doc ).pipe(map(u => {return { doc, ...u}})))               });             });             return forkJoin(observableBatch);           })         )         .subscribe(products => {          }); 
</div
     

回答リスト

0
 
vote
vote
ベストアンサー
 

あなたがストリームを書くとき、物事を小さなステップに分割するのがよくよく、あなたはあなたが必要とするまでストリームを変革し続けます。

おそらく購読の令ではまったく同等ではありませんが、次のようなものでもよく見ると思います:

<事前> <コード> this.firebaseService.searchCollection('product', 'shopId', this.shopId).pipe( // Here we have Observable<Product[]> mergeMap(products => products) // Now we have Observable<Product> mergeMap(product => JSON.parse(product['anotherTblDocIds'])) // Now we have Observable<DocIds> (for each product) mergeMap(docId => this.firebaseService.readCollectionByDocId('doc', doc).pipe( // We need to this map inside this stream to have the reference to `docId` map(u => ({ doc: docId, ...u })) )) )

<コード> mergeMap は、観測値と配列の両方を平坦化するため、この方法で使用できます。

 

When you write a stream it's often better to break things into small steps, and you keep transforming the stream until what you need.

Maybe this won't be exactly equivalent in terms of orders of subscriptions, but I think it would look better with something like:

this.firebaseService.searchCollection('product', 'shopId', this.shopId).pipe(   // Here we have Observable<Product[]>    mergeMap(products => products)   // Now we have Observable<Product>    mergeMap(product => JSON.parse(product['anotherTblDocIds']))   // Now we have Observable<DocIds> (for each product)    mergeMap(docId => this.firebaseService.readCollectionByDocId('doc', doc).pipe(     // We need to this map inside this stream to have the reference to `docId`     map(u => ({ doc: docId, ...u }))   )) ) 

mergeMap will flatten both Observables and arrays, so it can be used this way.

</div
 
 

関連する質問

2  RXJS 1つのシーケンス複数のサブスクリプションはXを取る  ( Rxjs one sequence multiple subscriptions take x ) 
値の配列から作成可能なRXJSがあるとしましょう。 <事前> <コード> let obs = Observable.fromArray([1,2,3,4,5,6]); いくつかのボタンをクリックすると、これを行います。 <事前> <コード> obs.tak...

0  Angular2 / TypeScriptでは、自分のデータで観察可能なものを更新することができますか?  ( Is it possible to update observable with own data in angular2 typescript ) 
私はそのような非同期を持つNGFORを持っています: <事前> <コード> <div *ngFor="let location of googleSearchLocations | async"> <div *ngFor="let location of fa...

45  RXJSを使用したリフレッシュトークンの処理  ( Handling refresh tokens using rxjs ) 
Angular 2から始めていますので私はMAP()の呼び出しを持ち、これらのサービスを使用しているコンポーネントは、応答を待つためにSubscribe()を使用するだけです。これらの単純なシナリオのために、私は本当にRXJSに掘り下げる必要がありましたので...

3  Angular 7プロパティ 'Share'は観測可能なタイプに存在しません  ( Angular 7 property share does not exists in type observable ) 
私は角度7でCachcingServiceBaseを書き込んでいましたが、次のようなエラーは「観察可能なシェアは関数ではありません」です。 <事前> <コード> import "rxjs/add/operator/share"; import { Observ...

2  RXJS:NodeJSのGroupByとObservable.Fromeventsの上で取り組んでいます  ( Rxjs working on groupby and observable fromevents in nodejs ) 
RXJSに非常に感銘を受けて、実際にはそれに取り組んでいきます。ただし、私の次のNodeJSコードは少なくとも私にとって期待どおりに機能しません。 <事前> <コード> let events = new EventEmitter(); let source ...

0  Angular BeaviorSubjectで新しいオブザーバーに到着する上で機能を実行してください  ( Execute some function on arriving a new observer in angular behaviorsubject ) 
新しいオブザーバーが角度内のBeabriorSubjectのために到着したときにいくつかの関数を実行したいです。 <事前> <コード> export class MyClass { public bs: BehaviorSubject<string> = ...

8  Angular2:トークンの更新のための401エラーをキャッチします  ( Angular2 catching 401 error for token refresh ) 
私はAngular2に慣れており、401の誤りを鳴らして、プランでオリジナルのリクエストを再試行する予定です... これはmy authservice.refreshメソッドです: <事前> <コード> refresh() : Observable<any>...

0  Angular 6で動的データを再計算するにはチェックボックスをバインドする方法6型スクリプトを使用して  ( How to bind checkbox to recalculate dynamic data in angular 6 using type script ) 
チェックボックスイベントが変更されたときにデータの結果を操作したいと思いました。動的データをテーブルに入力し、オプションが含まれていない場合はフィルタリングされます。 RXJSを使用してデータをフィルタリングすることは可能ですか? データバインディングを達...

0  観測できる約束をマージする  ( Merge promise with observable ) 
ここに私のサービスの抽出です、私はそれが非常にきれいに見えるように見えるように見えるでしょう。私はある意味があると確信しています、私はちょうどいいです。 <事前> <コード> import { Injectable } from '@angular/core...

242  HTTPメソッドによって作成されたObseverから登録解除する必要がありますか?  ( Is it necessary to unsubscribe from observables created by http methods ) 
メモリリークを防ぐために、Angular 2 HTTP呼び出しから退会する必要がありますか? <事前> <コード> fetchFilm(index) { var sub = this._http.get(`http://example.com...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有