使用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
版本不起作用?谢谢!
答案 0 :(得分:1)
concat
和forkJoin
的工作方式略有不同。
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
仅在所有源可观察对象完成之后才发出。