[英]How can I use Observables instead of Promises?
我有一個帶有某些方法的服務,其中大多數方法都需要一定的回調才能完成工作。 使用Promises(偽),很容易做到這一點:
ready = http.get(stuff); // Returns a promise, resolves after a while
methodOne() { // methods sometimes called before promise resolves
this.ready.then(_ => {
// doStuff
});
}
methodTwo() {
return this.ready.then(d => {
// doOtherStuff
});
}
基本上,只有在我確定服務已准備就緒時,我才需要做這些事情。 我其實只需要檢查它是否已經准備好(什么methodOne
在做什么,只是說明methodTwo
,它很容易更多的東西為好)。
我想嘗試所有關於Observables的事情,但是對於這種特定情況,我發現很難與類似的Observables解決方案競爭。
承諾將記住該值,並知道它是否已解決。 一個Observable稍微復雜些,似乎創建相同的流程很麻煩。 我需要訂閱Observable的任何東西,知道它何時准備就緒。 有時,該方法被稱為早期-在Observable發出之前,有時是在Observable已經發出之后,延遲。
我現在有這個,但似乎不起作用:
this.ready$ = someObservable // Will fire after a litle while but never finish - i only need the first to check though.
.publishReplay(1).refCount(); // Trying to replay if subscription comes after emit.
this.ready$.subscribe(_ => {
// This will be called
});
methodOne() {
this.ready$.subscribe(_ => {
// Not called
});
};
也許我誤解了publishReplay
和refCount
的使用?
我認為您正在尋找的是AsyncSubject 。 它很好地模仿了諾言行為。 說明如下:
AsyncSubject是一個變體,其中只有Observable執行的最后一個值發送到其觀察者,並且僅在執行完成時發送。
這是如何在您的情況下使用:
subject = new AsyncSubject();
ready = streamOfData(stuff).first().subscribe(subject);
methodOne() {
return this.subject.asObservable();
}
主題訂閱了first
運算符返回的基礎可觀察對象,並等待其完成。 它收集所有訂戶,但不向其發送任何值。 基礎可觀察對象一旦完成,它就會記住該值並將其發送給收集的訂戶。 所有未來的新訂戶將立即通過此存儲的解析值。
這是一個簡單的示例,演示您可以在可觀察對象完成之前或之后進行訂閱:
const subject = new AsyncSubject();
const o = subject.asObservable();
o.subscribe((v) => {
console.log(v);
});
interval(500).first().subscribe(subject);
setTimeout(() => {
o.subscribe((v) => {
console.log(v);
});
}, 2000);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.