服務1.ts
public allFlags$: BehaviorSubject<FlagName> = new BehaviorSubject<FlagName>("feature-flag-1");
設定如下:
private _setFlags = () => {
const allFlags = this._ldClient.allFlags();
if (allFlags && Object.keys(allFlags).length > 0
|| (!isUndefinedOrNullOrEmpty(localStorage.getItem(LocalStorageKeys.LaunchDarklyFlags)
&& JSON.stringify(allFlags) !== localStorage.getItem(LocalStorageKeys.LaunchDarklyFlags)))
) {
this._flags = allFlags;
// Notify the subscribers just in case someone is watching this
// before setup completes.
this.allFlags$.next(this._flags);
localStorage.setItem(LocalStorageKeys.LaunchDarklyFlags, JSON.stringify(this._flags));
}
}
它像這樣在組件上消耗:Component1.ts
this._launchDarklyService.allFlags$.subscribe(flags => this._allFeatureFlags(flags))
private _allFeatureFlags = (flags: FlagName): void => {
flags = JSON.parse(this._launchDarklyService.getAllFlags())
if (!(flags && Object.keys(flags).length === 0)) {
let err = new WebClientException();
err.ErrorMessage = 'LaunchDarkly- AllFlags- ' JSON.stringify(flags);
err.LogType = LogType.INFO;
this._observable = this._userService.reportError(err)
.subscribe();
}
}
這里的問題是因為我在 Observable 訂閱中訂閱(進行后期呼叫),因此 EventLogger 中有多個日志。我怎樣才能解決這個問題?
uj5u.com熱心網友回復:
聽起來您想要做的只是觸發 1 個 http 呼叫 -this._userService.reportError(err)每次allFlags$observable 推送下一個資料。有多種方法可以實作這一點 - 我會研究 rxjs對如何只能從 observable 監聽第一個資料的看法。就像是this.userService.reportError(err).pipe(take(1)).subscribe()
或者你可以通過toPromise()方法將該 observable 變成一個 promise ,它只發出一次然后完成
或者,由于呼叫.subscribe()回傳一種取消訂閱的方式,您可以在第一個訂閱決議后呼叫該方法:
const unsubscriber = myApiCall.subscribe(() => unsubscriber.unsubscribe());
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/376700.html
