当前位置: 首页 > 知识库问答 >
问题:

我如何“等待”可观测到的Rx?

贲俊才
2023-03-14

我希望能够等待一个可观察的时间,例如。

const source = Rx.Observable.create(/* ... */)
//...
await source;

天真的尝试会导致等待立即解析,而不会阻止执行

编辑:我的全部预期用例的伪代码是:

if (condition) {
  await observable;
}
// a bunch of other code

我知道我可以将其他代码移动到另一个单独的函数中,并将其传递到subscribe回调中,但我希望能够避免这种情况。

共有3个答案

越福
2023-03-14

很可能是这样

await observable.first().toPromise();

正如在前面的评论中所指出的,当存在空的完成可观测值时,take(1)first()运算符之间存在实质性差异。

Observable.empty().first().toPromise()将导致拒绝EmptyError,因为实际上没有值,因此可以相应地处理该错误。

Observable.empty().take(1).toPromise()将使用未定义的值进行解析。

从元明
2023-03-14

使用新的firstValueFrom()lastValueFrom()而不是toPromise(),正如这里所指出的,它在RxJS 7中被弃用,并将在RxJS 8中删除。

import { firstValueFrom} from 'rxjs';
import { lastValueFrom } from 'rxjs';

this.myProp = await firstValueFrom(myObservable$);
this.myProp = await lastValueFrom(myObservable$);

这在RxJS 7中可用

见:https://indepth.dev/rxjs-heads-up-topromise-is-being-deprecated/

司寇经亘
2023-03-14

您必须向wait传递promise。将可观察对象的下一个事件转化为promise,然后等待。

if (condition) {
  await observable.first().toPromise();
}

编辑说明:此答案最初使用.take(1),但改为使用.first(),这避免了如果流在值通过之前结束,则promise永远不会解决的问题。

从RxJS v8开始,toPromise将被删除。相反,可以用wait firstValueFrom(observable)

 类似资料:
  • 我有一个带有http请求的服务,它返回我的标题的可观察到的内容 servise.ts 在我的组件中,我有一个函数从service get Request设置。看起来是这样的: 问题是,有时我接收到带有空标签的标题,不需要显示它们,所以我需要对其进行过滤,并对此标题发送.delete()请求。我尝试了类似的方法(想法是在之前添加,然后在另一个subscribe内部调用。)差不多吧 但不确定这是不是个

  • 我有这个问题,我一直在寻找,但找不到解决方案(或者也许我不能根据其他答案做出解决方案)。 我的问题是,我需要找到一种方法来等待可观察的(有自己的订户)并等待另一个可观察的(有自己的订户)完成。 场景是这样的: 奥布1- 奥布斯2 - 我主要担心的是我需要两个订阅者。在我看来,obs1 和 obs2 并行运行,但需要检查 obs1 是否以新的会话令牌完成。也许这不是RxJava的主要目的。 Obs1

  • 我有两个源观测值,当一个源观测值发出时,我需要计算一些数据。我试图使用操作符,但它只在每个源观测值第一次发出时发出一个值。 是否有任何运算符类似于,一旦任何源可观测对象第一次发出,就立即发出?如果没有,最清晰的方法是什么? 我所尝试的:

  • 我正在将angular 2组件转换为使用异步数据源。 我有一个<代码> 这会导致错误: 找不到类型为“object”的不同支持对象“[object]”。NgFor只支持绑定到数组之类的可重用文件。 我试过

  • 问题内容: 我在弄清楚如何使用Selenium的wait函数时遇到了麻烦。我正在尝试做的是检查元素是否存在以及是否存在,然后将打印一条语句。这是我的代码: 当前代码给我以下错误: 问题答案: 预期条件期望将元组传递进来,其中第一项是定位器的类型(常量),第二项是定位器的值: 请注意,您的情况会更简单:

  • 我最近开始学习改装和rxjava。我在寻找关于如何等待和获得第一次观察结果的任何想法。基本上,我想在一个简单的登录上应用它。第一个api调用是获取服务器时间。第二个api调用将等待第一个调用的结果(即服务器时间)并利用它。 现在,我被困在这里了。在第二个可观察对象上,特别是在getNetworks方法上,我想使用我从第一个可观察对象得到的东西。有什么想法吗? 编辑: 我想先处理call 1的结果,