rxjs如何传递可观察到的地图

时间:2018-11-01 14:13:42

标签: angular rxjs observable

我是angular和rxjs的新手-基本上,我有一个pipe函数,它需要几个运算符,其中一个需要一个带有三元数的“ map”,该三元数是一个空数组或另一个可观察到的值来自http请求:

search = (text: Observable<string>) => {
  return text.pipe(
    debounceTime(200),
    distinctUntilChanged(),
    map(term => term.length < 3 ? [] : performSearch(text))
  );
}


performSearch(searchTerm: Observable<string>): Observable<Object> {
  return this.http.get('/api/header-search-results/con').pipe(
    map(res => {
      console.log(res);
      return res;
    })
  );
}

我知道我做错了,我只是不知道什么-我在浏览器中遇到错误:

  

找不到类型为“对象”的其他支持对象“ [对象对象]”。 NgFor仅支持绑定到数组等Iterables

我将不胜感激

2 个答案:

答案 0 :(得分:1)

在实现中,merge运算符将返回一个可观察对象或一个对象。我建议您仅使用对象或仅可观察对象。如果您选择第二种解决方案,则还应考虑根据您的需求来平整您的流concatMap, mergeMap, switchMap, ...的运算符。

实施示例:

search = (text: Observable<string>) => {
  return text.pipe(
    debounceTime(200),
    distinctUntilChanged(),
    concatMap(term => term.length < 3 ? of([]) : performSearch(text))
  );
}


performSearch(searchTerm: Observable<string>): Observable<Object> {
  return this.http.get('/api/header-search-results/con').pipe(
    map(res => {
      console.log(res);
      return res;
    })
  );
}

答案 1 :(得分:1)

如果需要返回一个空数组,只需用of()包装(在RxJS 6中),然后使用map代替mergeMap即可订阅返回的内部Observable。

import { of } from 'rxjs';

...

search = (text: Observable<string>) => {
  return text.pipe(
    debounceTime(200),
    distinctUntilChanged(),
    mergeMap(term => term.length < 3 ? of([]) : performSearch(text))
  );
}