Concat发出警告,但不会执行

时间:2019-03-18 23:28:48

标签: angular rxjs

使用forkJoin的以下方法可以正常工作,但是。 。

unifiedSearch : Function = (query: string) : Observable<UnifiedSearch> => {
  return forkJoin(this.searchService.gitSearch(query), this.codeSearchService.codeSearch(query))
  .map( (response : [GitSearch, GitCodeSearch]) => {
    return {
      'repositories' : response[0],
      'code': response[1]
    }
  })
}

。 。 。我尝试将其转换为使用concat作为分配的一部分,但是当它编译时,我收到一堆警告,并且浏览器中没有任何内容。

unifiedSearch : Function = (query: string) : Observable<UnifiedSearch> => {
  return concat(this.searchService.gitSearch(query), this.codeSearchService.codeSearch(query))
  .map( (response) => {
    return {
      'repositories' : response[0],
      'code': response[1]
    }
  })
}

作为参考,这里是“统一搜索”界面:

import {GitSearch} from './git-search';
import { GitCodeSearch } from './git-code-search';

export interface UnifiedSearch {
    repositories: GitSearch,
    code: GitCodeSearch
}

如果有帮助,以下是我收到的警告:

./node_modules/rxjs/Observable/of.js There are multiple modules with names that only differ in casing. This can lead to unexpected behavior when compiling on a filesystem with other case-semantic. Use equal casing. Compare these module identifiers: * C:\Users\Johnathan\advanced_angular\node_modules\rxjs\Observable\of.js Used by 1 module(s), i. e. C:\Users\Johnathan\advanced_angular\node_modules\rxjs\Observable\concat.js * C:\Users\Johnathan\advanced_angular\node_modules\rxjs\observable\of.js Used by 2 module(s), i. e. C:\Users\Johnathan\advanced_angular\node_modules\@angular\common\@angular\common\http.es5.js

有什么想法为什么concat版本不起作用?谢谢!

1 个答案:

答案 0 :(得分:1)

concatforkJoin的工作方式略有不同。

concat从每个源发出每个值,顺序为发射顺序和作为参数传递给concat运算符的顺序。源代码完成后,它将移至源代码数组中的下一个。

forkJoin将给出每个可观察到的最后发出的值,然后将这些值返回到数组中。它将等到所有给定的可观察物完成后再发射。

以下面的示例为例:

const source1 = of(1, 2);
const source2 = of(3, 4);


concat(source1, source2).subscribe(v => console.log(v))
// output (each line is new emit)
// 1
// 2
// 3
// 4

forkJoin(source1, source2).subscribe(v => console.log(v))
// output (each line is new emit)
// [2, 4]

您可能想看看使用combineLatest组合每个源的发射,并在每次观察到一个源可观察物时发射最新的组合值。此与forkJoin之间的区别在于,combineLatest会在每次源可观察对象发出时发出,而forkJoin仅在所有源可观察对象完成之后才发出。