Javascript Rxjs-组合2个观察值并发出组合结果不起作用

Javascript Rxjs-组合2个观察值并发出组合结果不起作用,javascript,rxjs,observable,Javascript,Rxjs,Observable,首先,这里是我对rxjs的导入语句: import { Subject, Observable, merge, combineLatest } from "rxjs"; import { map } from 'rxjs/operators'; 以下是我在package.json中的rxjs版本: “rxjs”:“^6.5.2” 我有一个可观察(this.searchResults$),它发出搜索API请求的结果。我现在想再做一次搜索,将新的搜索结果与旧的搜索结果结合起来,并将它们全部放在th

首先,这里是我对rxjs的导入语句:

import { Subject, Observable, merge, combineLatest } from "rxjs";
import { map } from 'rxjs/operators';
以下是我在package.json中的rxjs版本:
“rxjs”:“^6.5.2”

我有一个可观察(
this.searchResults$
),它发出搜索API请求的结果。我现在想再做一次搜索,将新的搜索结果与旧的搜索结果结合起来,并将它们全部放在
this.searchResults$
this.handleSearch()
返回带有搜索结果的可观察值

我想我会这样做:

const newSearchResults$ = this.handleSearch(undefined, this.currentPage + x);
merge(newSearchResults$, this.searchResults$).subscribe(x => console.log(x));
但该控制台记录:

(10) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
(6) [{…}, {…}, {…}, {…}, {…}, {…}]
控制台日志的第二行需要包含16项。相反,它会被新的6项覆盖

我在网上查看了为什么合并不合并结果,发现我应该使用
combinelateest

const newSearchResults$ = this.handleSearch(undefined, this.currentPage + x);
newSearchResults$.subscribe(x => x);
const combinedSearchResults$ = combineLatest(newSearchResults$, this.searchResults$)
    .pipe(map(([s1, s2]: Array < any > ) => [...s1, ...s2]));
combinedSearchResults$.subscribe(x => console.log(x));

我也无法将任何内容发送到console.log。

如果您不想合并2个观测值,可以使用mergemap操作符。 试着这样做:

var obs1 = lastData;
var obs2 = newData;

obs1.pipe(
    mergeMap(d1 => obs2.pipe(map(d2 => [...d1, ...d2])))
).subscribe(console.log);
其次,如果使用cold或hot observable,请注意,因为如果使用cold observable,则不会保存值,并且每次订阅时都会调用API。(您可以使用shareReplay操作符从冷创建热可观测

或者您可以使用本例中的BehaviorSubject:

您能否在线复制stackblitz的问题。谢谢。它似乎也不会记录任何内容。我已将代码添加到了页面底部question@BeniaminoBaggins我在这里试过了,实际上你可以使用BehaviorSubject,它存储上次释放的值,你可以释放新的值。我在回答的末尾添加了一个例子
var obs1 = lastData;
var obs2 = newData;

obs1.pipe(
    mergeMap(d1 => obs2.pipe(map(d2 => [...d1, ...d2])))
).subscribe(console.log);