我有一个带有某些方法的服务,其中大多数方法都需要一定的回调才能完成工作。使用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是一种变体,其中只有
  可观察的执行被发送给它的观察者,并且仅当
  执行完成。


这是如何在您的情况下使用:

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);

关于javascript - 如何使用Observables代替Promises?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45466563/

10-10 18:44