我正在為 ORM 物體實作 findOrSave 方法,并希望使用 rxjs 函式 concatMap 和 iif 組合 observables。
但是,不知何故我的代碼不起作用:
return from(this.repository.findOne({ where: { label: ILike('%' title '%') } })).pipe(concatMap(ge => {
return iif(() => !!ge, of(ge), from(this.repository.save({label: title})));
}))
我有一個非鍵但唯一的值,例如標簽,并希望使用 findOne 檢索物體。如果 findOne 回傳一個物體,它應該被回傳。否則它應該被保存并且應該回傳存盤的物體。
雖然 findOne 似乎作業得很好,但即使 iif 的第一個引數回傳 false,save 方法也會以某種方式被呼叫。
我無法真正理解這一點,因為這個片段有效:
return from(this.repository.findOne({ where: { label: ILike('%' title '%') } })).pipe(concatMap(ge => {
return iif(() => !!ge, of(ge), new Observable<GreaterEntity>(subs => {
from(this.repository.save({label:title})).subscribe(v => {
console.log('Saving id ' v.id)
subs.next(v);
})
}));
}))
如果有人能指出我犯的錯誤,我將非常感激:)
uj5u.com熱心網友回復:
問題是當被呼叫時iif
,你通過了from(this.repository.save({label: title}))
。這會立即 呼叫 this.repository.save()
,無需等待任何訂閱。
為避免這種情況,您可以使用defer
.
from(
this.repository.findOne({ where: { label: ILike('%' title '%') } })
).pipe(
concatMap(ge => iif(
() => !!ge,
of(ge),
defer(() => from(this.repository.save({label: title})))
))
)
defer
只有在訂閱它時才會呼叫回呼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/529952.html
標籤:打字稿rxjs打字机
上一篇:如何根據打字稿中的模式分離出部分字串(可能使用正則運算式)
下一篇:反應打字稿可選引數