首页 > 解决方案 > 使用 rxjs Observables 实现广度优先搜索

问题描述

我试图实现的东西并不完全是广度优先搜索,但它与常见的广度优先搜索的实现方式相似。当尝试使用广度优先搜索找到最短路径时,您从一个具有起始节点的队列开始,弹出该节点,并将该节点的子节点添加到队列中,继续循环。当你找到你正在寻找的结束节点时,你停止执行/从队列中弹出东西。

我想要做的是有一个可以订阅的外部 Observable。当有人订阅时,它会启动一个内部 Observables 的基本队列。随着这些可观察对象的运行,它们会将其他可观察对象添加到内部可观察对象的队列中。如果在可观察执行期间的某个时刻达到了我正在寻找的值/场景,我想发出该值并完成外部可观察。如果没有找到值/场景,我想发出null并完成外部 observable。人们对我可以用来完成这样的事情的内置 rxjs 魔法有什么建议吗?我一直在查看我认为可能有帮助的queueScheduler,但我不知道我将如何返回null当我用完事件时。当队列中没有任何内容时,我需要它自行完成,然后触发,以便我可以完成订阅者的外部 observable。如果我找到我想要的值/场景,我还想取消任何排队的操作。

标签: angularalgorithmrxjslogic

解决方案


concat我相信您可以通过组合通常的 rxjs 运算符 ( , ) 等来获得您想要的大部分内容switchMap。当订阅被取消订阅时,它将依次取消订阅每个 observable,因此生产者不需要知道消费者已经找到了它正在寻找的价值。

在 stackblitz 上写了一个例子。使用filter,take(1)toArray运算符,它会将找到的值作为单例数组或空数组发出,然后完成。


推荐阅读