Javascript 我如何使用可观察到的信息而不是承诺?

Javascript 我如何使用可观察到的信息而不是承诺?,javascript,angular,promise,es6-promise,reactivex,Javascript,Angular,Promise,Es6 Promise,Reactivex,我有一个带有一些方法的服务,大多数方法都需要完成某个回调才能完成它的工作。有了承诺,在虚拟环境中,很容易做到这一点: ready = http.get(stuff); // Returns a promise, resolves after a while methodOne() { // methods sometimes called before promise resolves this.ready.then(_ => { // doStuff

我有一个带有一些方法的服务,大多数方法都需要完成某个回调才能完成它的工作。有了承诺,在虚拟环境中,很容易做到这一点:

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演示一下,
methodOne
,它也很容易找到更多的东西)

我想试着把所有的精力都放在观察上,但对于这个特殊的例子,我发现很难与类似的观察解决方案竞争

承诺会记住它的价值,并知道它是否得到了解决。一个可观测的数据流稍微复杂一些,创建同样的数据流似乎很麻烦。我需要任何订阅可观测的东西,知道它何时准备好。有时,该方法会在可观察到的发射之前调用,有时会在可观察到的发射之后调用

我现在有这个,但似乎不起作用:

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是一个变量,其中只有 可观察的执行被发送给它的观察者,并且只有当 执行完成

以下是如何在您的案例中使用它:

subject = new AsyncSubject();
ready = streamOfData(stuff).first().subscribe(subject);    
methodOne() {
    return this.subject.asObservable();
}
主体订阅由
first
操作符返回的底层可观察对象,并等待它完成。它收集所有订阅者,但不向他们发送任何值。一旦底层可观察对象完成,它就会记住该值并将其发送给收集的订户。所有新的未来订阅服务器将立即传递此存储的解析值

下面是一个简单的示例,演示了您可以在observable完成之前或之后订阅:

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

“既然我在做一个角度的项目,首选的方法就是全力以赴地研究可观测物”谁更喜欢?有什么理由?还有什么支持数据?@T.J.Crowder我将编辑我的陈述,因为它可能是主观的,但我看到它提到了几个地方。我很快就投了接近票——我需要一个可观察的解决方案,措辞可以(而且已经)改变,因此不再以观点为基础。“可观察真的是承诺的好替代品吗?”表面上看,是征求意见。(顺便说一句,这不是我的投票结果)如果问题真的是“我如何才能使用可观察的东西而不是承诺?”我会编辑问题标题来说明这一点。我也会编辑,使它更简洁。(一个人在SO的回答中表达了自己的观点,这不能作为一个有支持性数据的合理理由。)@T.J.Crowder好的观点,标题被更改了。我应该提到的是,这个例子并没有加载http请求——它确实是一个永不结束的流。我将更新我的问题以更清楚地反映这一点。我想我可以在我的可观测数据上使用.first()。。。“我会试试看的。”佩霍恩什·席尔贝克,那么你应该如何在永不止息的溪流中使用承诺呢?承诺都是关于一个已解析的值。我会包装第一个值并解析承诺then@PerHornshøj-Schierbeck,好的,先使用
然后使用
。更新了我的回答这与我自己尝试使用replaySubject(1).refCount()时的行为非常相似。它适用于承诺(刚刚测试过),但这两个可观察的示例只有在第一个/唯一发出之前调用订阅(您的methodOne)时才起作用。想想看,打电话给.first()取消订阅,也许这就是原因?