簡體   English   中英

如何使用Observables代替Promises?

[英]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
    });
};

也許我誤解了publishReplayrefCount的使用?

我認為您正在尋找的是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM