rxjs - 根据先前发出的值阻止执行
问题描述
如果我的 typeahead 得到一个空的搜索结果,那么应该阻止任何后续的带有 norrowed 搜索查询的查询。例如,如果搜索“ red ”返回空,搜索“ redcar ”就没有任何意义。
我尝试使用 pairwise() 和 scan() 运算符。代码片段:
import { tap, switchMap, filter, pairwise, scan, map } from 'rxjs/operators';
this.searchForm.get('search').valueChanges
.pipe(
switchMap( queryString => this.backend.search(queryString))
)
.subscribe()
更新给定一个简化的场景:后端 只有术语“苹果” 。用户正在输入搜索字符串(请求未被 switchMap() 中止):
- 'a' --------> 后端调用返回 'apple'
- 'ap' ------> 后端调用返回 'apple'
- 'app' -----> 后端调用返回 'apple'
- 'appl' ----> 后端调用返回 'apple'
- 'apple' ---> 后端调用返回 'apple'
- 'apple p' -----> 后端调用返回 EMPTY
- 'apple pi' ----> 后端调用返回 EMPTY
- 'apple pie' ---> 后端调用返回 EMPTY
后端调用 7. 和 8. 是不必要的,因为 6. 已经返回 EMPTY。因此,可以省略任何后续调用。在我看来,需要一些记忆。
我想防止不必要的后端调用(http)。有没有办法在 rxjs 中实现这一点?
解决方案
您可以使用过滤器运算符:
this.searchForm.get('search').valueChanges.pipe(
filter(query => query)
switchMap(query => this.backend.search(queryString))
)
你可以在这里尝试这个机制:RxJS-Editor
代码共享不起作用,因此您可以在此处获取代码:
const { of } = Rx;
const { filter } = RxOperators;
of('foo1', 'foo2', undefined, undefined, 'foo3').pipe(
filter(value => value)
)
推荐阅读
- c++ - C++ 变体:为什么转换构造函数需要 sizeof...(Types) 为非零
- sockets - 解码专有 LED 调光数据
- python - 为什么使用 Pandas 合并两个 CSV 文件时数据会被删除?
- powershell - 从文件夹中的 30 个不同文件中仅提取 powershell 中 csv 文件的前 10 行
- mysql - Laravel 搜索查询仅匹配完整的单词
- google-colaboratory - 设置环境
- git - 无法解析支持的身份验证方案:操作标识符在 GitKraken 中无效
- html - CSS Sidebar 与 Navbar 重叠,无法让 div 堆叠
- mechanicalturk - Mturk:三个任务,但只有一个 HIT
- azure - 如何嵌套 Azure 函数应用(如何调用另一个函数应用)