typescript - Observable 'save' 应该返回 EMPTY 或一个虚拟值
问题描述
我在我的应用程序中看到一个常见模式,其中函数返回不需要提供next()
值(即save()
)但可能是 Observable 链的一部分的 Observable。
在这个工作示例(下面的链接)中,我有一个BookService
带有save()
和的演示getBooks()
。代码示例保存了 2 本书,从服务和控制台获取书籍,并通过单个可观察链记录书籍。
我已经尝试了这两个选项:
选项1:
save(title: string): Observable<never>
返回EMPTY
。这意味着next()
永远不会调用订阅者。为了让可观察链继续使用单个值,我pipe(defaultIfEmpty(true))
在调用save()
.优点:功能有效,只需调用
complete()
.save()
不需要返回没有意义的值。缺点:调用
defaultIfEmpty(true)
链 observable 看起来并不直观。
选项 2:
save(title: string): Observable<boolean>
返回一个值of(true)
。函数有效,两者都next()
将complete()
被调用一次。优点:不需要
defaultIfEmpty(true)
链 observable。Con:
next()
总是被调用。这被认为是骗局吗?
选项 3:
- 请让我知道是否有更好的方法。
该代码示例提供了选项 1 和选项 2(已注释)。
问题:返回之类的函数应该是什么save()
?是否有关于此类场景的可观察设计的书面文档/文章?
感谢您对此的想法。
解决方案
我的理解是,这取决于您的用例。使用 Observables 允许你为你的.Save()
函数实现取消行为。它是否返回一个值或只是完成取决于您。根据您的使用情况(您是否总是使用defaultIfEmpty
它?)您可以选择纯版本(没有价值,只是完成)或让它默认为一个值以使您自己更容易。
重要的是你记录你的.Save()
函数的消费者可以期望你的 observable 的行为。它真的会只发出一个true
值并完成吗?或者从不发出值?
推荐阅读
- node.js - 拖放后如何更新记录
- python - 如何使用 for 循环比较 Python 中的两个列表?
- java - 二维数组转换(整数到字符串)
- python - 连续的 ipywidgets 按钮
- windows - 如何使 Windows 文件资源管理器在图块中从上到下而不是从左到右显示文件`
- python - 涉及列表操作的 Python 函数的时间复杂度
- log4net - log4net 没有将精确时间记录到数据库
- mysql - AWS Lambda 函数返回方括号“[]”结果
- c# - 检测玩家是否被阴影 unity2D 击中
- powershell - 如何在PowerShell中调用多个属性