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