Angular 2 + RxJS:带有 .share() 运算符的异步管道

2024-03-08

当使用async管道上的可观察对象正在使用.share()运算符(由于后端计算成本高昂),我偶然发现了这种行为:

data$ = (new Observable(observer => {
    let counter=0;
    observer.next(counter)

    window.setInterval(() => {
      observer.next(counter);
      counter++;
    }, 2000);
  }))
  .share();

模板:

{{ (data$|async) !== null }}
{{ (data$|async) !== null }}

初始值的输出为:

true false

以下输出(超过 2 秒后)是:

true true

这也是我对第一个值的期望行为。 如果我省略.share(),第一个值的输出是"true true",正如我所料。我认为上面的行为是由于模板中的第一个表达式触发可观察的执行,并且一旦第二个表达式async管道订阅了可观察的数据,数据已经消失了。这个解释正确吗?我怎样才能避免这种行为?


根据参考资料 https://angular.io/docs/ts/latest/api/common/index/AsyncPipe-pipe.html,

异步管道订阅 Observable 或 Promise 并返回其发出的最新值。

在 RxJS 4 中,shareReplay用于实现所需的行为。

在 RxJS 5 中,直接对应shareReplay is publishReplay其次是refCount (看解释 https://stackoverflow.com/questions/35246873/sharereplay-in-rxjs-5 and 讨论 https://github.com/ReactiveX/RxJS/issues/453).

所以应该是

data$ = (new Observable(observer => { ... }))
.publishReplay(1)
.refCount();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular 2 + RxJS:带有 .share() 运算符的异步管道 的相关文章

随机推荐

  • 是否可以编写一个 Rust 宏“has_trait!(,|)”?

    我想匹配 例如一个ident的类型来实现某种特征 我该怎么做 这是 不完整 代码的基本思想 macro rules has trait t ty x ident gt fn trait test let a vec 1 2 3 let b
  • 如何从Python中的请求模块中完全删除任何日志记录

    如何从 Python 中的 requests 模块中完全删除任何日志记录 我什至不需要设置 临界 级别 像这样 import logging requests log logging getLogger requests requests
  • 如何使用一个查询获取包含子列表的列表?

    我想打印数据库表中的项目列表 并与每个项目一起打印一个相关子项目的小列表 最多 10 个项目 例如 我有这两个表 ITEMS id integer name string SUBITEMS id integer name string it
  • 如何输出带双引号的字符串?

    我需要输出一个字符串 它基本上是一个java代码 我有这样的事情 web if url contains mp4 我需要单引号 将是双引号 而不是在 html 代码中 有可能做到吗 new str str replace web 您可以选择
  • 防止其他人强制推送到我的 Git 存储库

    有没有办法阻止除了我之外的任何人强制推送到我的 Git 存储库之一 特别是在 Github 中 据我了解 受保护的分支可以完全防止强制推送 但只要我是这样做的人就可以了 每当 GitHub 存储库出现保护问题时 最可靠的强制执行方法就是拥有
  • 如果 CDN 失败,jquery-tools 会回退

    如果 Google 的 CDN 失败 我将使用 来回退并在本地提供 jquery 如下这个线程 https stackoverflow com questions 1014203 best way to use googles hosted
  • 基于容器元素在 AngularJS 指令内自动调整 SVG 大小

    我将一个角度指令放置在动态大小的元素内 该指令本身由一个基于元素大小计算的 SVG 组成 我正在尝试使 SVG 根据容器的大小自动调整大小和重绘 我最初尝试过这样的事情 我的指令 js angular module myModule dir
  • “foreach”是否会导致 Linq 重复执行?

    我第一次使用 NET 中的实体框架 并且一直在编写 LINQ 查询以便从我的模型中获取信息 我想从一开始就养成良好的编程习惯 因此我一直在研究编写这些查询并获取结果的最佳方法 不幸的是 在浏览 Stack Exchange 时 我似乎遇到了
  • 从 Geany 运行 Node.js 服务器

    一个简单的问题 是否可以配置 Geany IDE 以便可以使用 运行 按钮直接从 Geany 运行 Node js 服务器 当在 JS 文件中时 转到Build gt Set Build Commands 应该有一个章节标题Execute
  • KnockoutJS:如何将一个 observableArray 添加到另一个 observableArray?

    我想将选择元素中的选定选项添加到绑定表中 视图模型具有 addItem 函数 该函数使用 ko utils arrayPushAll 将 selectedItems 数组添加到 linkedItems 数组中 但是当我单击 添加 按钮 调用
  • 按字母顺序对对象数组进行排序

    我正在尝试按字母顺序对对象数组进行排序 为了使事情简单 我使用下面的示例 在我的打字稿中 我通过拼接来插入和删除数组对象中的项目 Array cars id 1 items name car1 description this is car
  • 如何使用 Rijndael 在 iOS 中加密 C# 中的解密字符串

    我正在尝试使用 Objective C 和 C 加密和解密字符串 两者在本机代码中都工作正常 但是当我尝试解密 C 中的字符串时 它在 iOS 中被加密 我收到一些错误 这是我在目标c中使用的代码 NSData AES256EncryptW
  • javascript 在 onload 中选择文本区域中的文本

    使用 JavaScript 加载页面时 如何自动选择文本区域中的文本 JSFiddle 演示 http jsfiddle net kjy112 V85mC 你可以这样做 HTML
  • 将文件夹的多个 csv 文件加载到一个数据框中

    我有多个 csv 文件保存在一个具有相同列布局的文件夹中 并希望将其作为 pandas 中的数据框加载到 python 中 这个问题确实与此类似thread https stackoverflow com questions 3833052
  • dequeueReusableCellWithIdentifier:forIndexPath 中断言失败:

    所以我正在为我的学校制作一个RSS阅读器并完成代码 我运行了测试 它给了我这个错误 这是它所引用的代码 UITableViewCell tableView UITableView tableView cellForRowAtIndexPat
  • Magento FPC Cache Warm 与用户组、wget、Lesti FPC

    我在 Magento 网站上使用 Lesti FPC 该网站有 10 个客户组和很多类别 产品 我创建了一个 shell 脚本 它会在一夜之间读取 sitemap xml 和 wget 的每个 url 以构建站点的缓存 这对于访客来说非常有
  • 不带 SQL 的 ContentProvider

    我有两条数据需要从外部应用程序访问并存储 根据文档 ContentProviders 是唯一可能的方式 但它也提到了外部存储 ContentProviders 实现了一个类似数据库的 接口 对于两条数据来说使用数据库是非常不必要的 我宁愿将
  • 如何将 XMLGregorianCalendar 与仅日期部分(日、月、年)进行比较?

    我正在开发一个与 spring struts Web 应用程序集成的 Web 服务 在 XSD 中有一个 XMLGregorianCalendar 类型属性 假设属性名称是trxDate 在 SOAPUI 测试应用程序中 如果我使用以下命令
  • Java:使用 Bouncy Castle 进行 PGP 加密

    我正在尝试使用 PGP 实现加密 并且我的加密方法成功加密了输入字符串 但是当我尝试解密它以验证加密是否正确完成时 该字符串不会被解密 我尝试了两种方法 第一种方法使用文件输出流编写加密字符串和第二种方法使用字节数组输出流 文件输出流创建一
  • Angular 2 + RxJS:带有 .share() 运算符的异步管道

    当使用async管道上的可观察对象正在使用 share 运算符 由于后端计算成本高昂 我偶然发现了这种行为 data new Observable observer gt let counter 0 observer next counte