我有一個看起來像這樣的服務:
export class WebViewService {
private webViewMessage = new ReplaySubject<any>(1);
public webViewMessage$ = this.webViewMessage.asObservable();
public isWebView: boolean = false;
constructor() {
this.isWebView = false;
if (window?.chrome?.webview)
{
this.isWebView = true;
}
window?.chrome?.webview?.addEventListener('message', (event: { data: any; }) => {
this.webViewMessage.next(event.data);
});
}
public postMessage(message: any) {
window?.chrome?.webview?.postMessage(message);
}
}
我有一個看起來像這樣的組件:
export class BrowserComponent implements OnInit {
constructor(private webViewService: WebViewService) { }
subscription!: Subscription;
ngOnInit(): void {
this.subscription = this.webViewService.webViewMessage$.subscribe(o => {
alert(o);
});
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
onClick() {
this.webViewService.postMessage("showDialog");
}
}
當呼叫 onClick() 方法時,會通過 webViewService 發布一條訊息,這反過來會導致父視窗(一個視窗表單)顯示一個檔案對話框,然后我想知道回應是什么,這將在網路視圖訊息$。我現在在訂閱中顯示一個 alert() 但將來會有所不同。
問題:當我離開 Browse 組件然后再次輸入它時,會彈出最后一個 webViewMessage$ 的警報,這是我所期望的,但不是我想要的。
我可以將 onClick() 代碼更改為如下所示:
onClick() {
this.webViewService.postMessage("showDialog");
this.subscription = this.webViewService.webViewMessage$.subscribe(o => {
alert(o);
this.subscription.unsubscribe();
});
}
但是,一旦我再次單擊 onClick() 按鈕,就會彈出最后一條訊息 - 我知道為什么會發生這種情況,但我無法“等待” postMessage() 方法接收回應。但同樣,我只想要在 this.webViewService.postMessage() 被呼叫之后收到的訊息。我該怎么做?
uj5u.com熱心網友回復:
ABehaviorSubject用于保留最后發出的值。這就是為什么當你創建它時,你必須提供一個默認值。
使AReplaySubject保留發出的給定數量的值。創建它時,您必須指定要保留的值的數量。
相反,使用 a Subject,觀察者僅在發送值時觸發,并且不保留最后發出的值。
private webViewMessage = new Subject<any>();
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/462673.html
標籤:有角度的 rxjs-observables 网络视图2
下一篇:如何以角度測驗帶有主題的服務
