我有 2 個火力基地清單原材料和庫存。庫存清單包含具有原材料鍵的物件。我用那把鑰匙來取原材料。我正在獲取所有庫存串列,然后當我遍歷串列中的每個物件以加入原材料時,問題是 observable 僅回傳第一個物件。意思是,它不會遍歷所有串列。這是我的代碼
rawMaterialsStocksRef: AngularFireList<any>;
rawMaterialStockRef: AngularFireObject<any>;
private dbPathStock = '/raw_material_stock';
constructor(
private db: AngularFireDatabase,
private rawMaterialService: RawMaterialsManagementService
) {
this.rawMaterialsStocksRef = db.list(this.dbPathStock);
}
getRawMaterialStockList() {
const rawData = this.rawMaterialsStocksRef.valueChanges().pipe(
map(rawMaterialsStocks =>
rawMaterialsStocks.map(stock => ({
...stock
}))
),
switchMap(stockArr => from(stockArr)),
// gives the following
// { "factoryKey": "34""quantity": "34", "rawMaterialKey": "-NDNPe47CDTbjmwGgW_3"}
// { "factoryKey": "20", "quantity": "20", "rawMaterialKey": "-NDIjiVqKP-lLwJGwmic"}
switchMap(stock =>
// this service i use to fetch each raw material based on its key
this.rawMaterialService.getRawMaterial(stock.rawMaterialKey).valueChanges()
.pipe(
map(rawMaterial => {
return { ...stock, ...rawMaterial }
})
)
),
);
rawData.subscribe()
}
這是我得到的結果
{
"factoryKey": "20",
"quantity": "20",
"rawMaterialKey": "-NDIjiVqKP-lLwJGwmic",
"code": "KLL2311",
"name": "Material 03"
}
如您所見,盡管陣列包含多個物件,但我只成功加入了一次!
請幫幫我,我花了 3 天的時間嘗試一切,但沒有成功!

uj5u.com熱心網友回復:
切換地圖
switchMap 中的 switch 是為了表示運算子的額外行為。Switch 的意思是“如果前一個 observable 處于活動狀態,則丟棄它,而是切換到這個 observable。”
concatMap 的意思是“如果還有一個活動的可觀察物件,則將其放入佇列中,以便在先前的可觀察物件完成后立即運行”
mergeMap 的意思是“我不在乎目前是否或有多少先前的可觀察物件正在運行。訂閱它們并發出任何源可觀察物件發出的任何東西”
將您的開關圖更改為其他兩個之一
mergeMap(stock => this.rawMaterial..........
........
旁白
我建議你選擇一種編程風格。您的代碼同時具有
map(stock => ({
...stock
}))
map(rawMaterial => {
return { ...stock, ...rawMaterial }
})
選項一:
map(stock => ({
...stock
}))
map(rawMaterial => ({
...stock, ...rawMaterial
}))
選項2:
map(stock => {
return { ...stock }
})
map(rawMaterial => {
return { ...stock, ...rawMaterial }
})
將它們混合在一起,使它們都在同一小段代碼中,使得連貫地瀏覽代碼變得更加困難。
更新#1
用于并行forkJoin回傳結果陣列。
mergeMap(stockArr => forkJoin(stockArr.map(stock =>
this.rawMaterialService
.getRawMaterial(stock.rawMaterialKey)
.valueChanges()
.pipe(
map(rawMaterial => ({ ...stock, ...rawMaterial }))
)
)))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/520423.html
