angular - 使用 rxjs Observables 实现广度优先搜索
问题描述
我试图实现的东西并不完全是广度优先搜索,但它与常见的广度优先搜索的实现方式相似。当尝试使用广度优先搜索找到最短路径时,您从一个具有起始节点的队列开始,弹出该节点,并将该节点的子节点添加到队列中,继续循环。当你找到你正在寻找的结束节点时,你停止执行/从队列中弹出东西。
我想要做的是有一个可以订阅的外部 Observable。当有人订阅时,它会启动一个内部 Observables 的基本队列。随着这些可观察对象的运行,它们会将其他可观察对象添加到内部可观察对象的队列中。如果在可观察执行期间的某个时刻达到了我正在寻找的值/场景,我想发出该值并完成外部可观察。如果没有找到值/场景,我想发出null
并完成外部 observable。人们对我可以用来完成这样的事情的内置 rxjs 魔法有什么建议吗?我一直在查看我认为可能有帮助的queueScheduler,但我不知道我将如何返回null
当我用完事件时。当队列中没有任何内容时,我需要它自行完成,然后触发,以便我可以完成订阅者的外部 observable。如果我找到我想要的值/场景,我还想取消任何排队的操作。
解决方案
concat
我相信您可以通过组合通常的 rxjs 运算符 ( , ) 等来获得您想要的大部分内容switchMap
。当订阅被取消订阅时,它将依次取消订阅每个 observable,因此生产者不需要知道消费者已经找到了它正在寻找的价值。
我在 stackblitz 上写了一个例子。使用filter
,take(1)
和toArray
运算符,它会将找到的值作为单例数组或空数组发出,然后完成。
推荐阅读
- java - 授予对 Kafka 和 Zookeeper SASL/PLAIN 服务器上的匿名用户的访问权限
- android - 如何以编程方式将 textview 添加到 ConstraintLayout?
- android - 如何从 Firebase 存储中获取 https:// url
- swift - PKAddPaymentPassViewControllerDelegate 的 generateRequestWithCertificateChain 方法中 UTF-8 编码格式转换为字符串的数据返回 nil
- python - 来自 Data 类的 Python 打印文件名
- gatling - 在 Gatling 中使用 formParams 的方法
- twilio - 如何使用 Action 检索 twilio 函数中的变量记住?
- python-3.x - 制作新列时修复 Pandas NaN?
- azure-stream-analytics - 关于如何为 Azure 流分析计算水印的说明
- node.js - “chunk”参数必须是字符串类型或 Buffer 的实例。收到一个 ArrayBuffer 的实例