首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rxjs同步?

Rxjs同步?
EN

Stack Overflow用户
提问于 2021-07-16 01:23:57
回答 4查看 1K关注 0票数 0

我最近开始做一个新的项目,我已经看过两次了,我是疯了还是永远不会在任何情况下工作?

代码语言:javascript
复制
protected get reportView(): any {
    let convertedView = null;
    this.store
      .pipe(select(fromStore.getTransferOrderConverted), rxjs.take(1))
      .subscribe((convertedOrder) => (convertedView = convertedOrder));
    return convertedView;
  }
EN

回答 4

Stack Overflow用户

发布于 2021-07-16 03:38:15

我是疯了还是在任何情况下都不会工作?

问:你疯了吗?

( A)是。绝对一点儿没错。看上去像疯了!

这在任何情况下都行不通吗?

哦,有时候这是可行的。一些观测值是同步的。

例如,这将始终记录一个2,因此这可以按照预期的方式工作。

代码语言:javascript
复制
let convertedView = null;

of(1).pipe(
    map(v => v + 1)
).subscribe(convertedOrder => convertedView = convertedOrder);

console.log(convertedView);

这是因为of(1)是同步可观测的。

然而,这是行不通的。

代码语言:javascript
复制
let convertedView = null;

of(1).pipe(
    delay(0),
    map(v => v + 1)
).subscribe(convertedOrder => convertedView = convertedOrder);

console.log(convertedView);

这将打印null。尽管delay(0)概念上不需要时间,但它仍然使用JSs事件循环,因此在当前代码完成之前不会执行。

我认为最好的做法是假设所有observables都是异步的。任何假定不同的代码都可能是脆弱的。

票数 1
EN

Stack Overflow用户

发布于 2021-07-16 02:11:38

您的store.subscribe是异步的,而您的其余代码不是异步的。您可以通过承诺解决这个问题,如下面的示例所示。

代码语言:javascript
复制
protected get reportView(): Promise < any > {
    return new Promise((resolve, reject) => {
        this.store
            .pipe(select(fromStore.getTransferOrderConverted), rxjs.take(1))
            .subscribe((convertedOrder) => resolve(convertedOrder));
    });
}

reportView.then(convertedOrder => {
    // do your stuff
});

此外,您还可以使用convertedOrder获得异步/等待。但是请记住,父函数必须是async

代码语言:javascript
复制
const convertedOrder = await reportView();
票数 0
EN

Stack Overflow用户

发布于 2021-07-16 02:57:31

将流转换为同步不是一个好的理想。但是,您可以使用subject (订阅)的方法toPromise将其转换为承诺并等待解决。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68402420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档