RxJS中combineLatest合并后subscribe无输出问题求助
嘿,我看到你在使用RxJS的combineLatest时遇到了控制台没有输出的问题,这是个很常见的新手误区,咱们来一步步把它搞定~
问题根源:combineLatest和subscribe的用法错误
你的代码里有两个关键错误导致了无输出:
combineLatest的参数顺序完全错了
你现在的写法是把投影函数直接作为第一个参数传给combineLatest,但实际上combineLatest需要先接收要合并的Observable集合(可以是多个单独参数,或者一个Observable数组),之后才是可选的投影函数。你根本没把player和walls这两个源Observable传入,所以combineLatest根本没有订阅任何数据流,自然不会触发任何回调。subscribe的回调参数处理错误
subscribe的回调函数只会接收一个参数:如果使用了投影函数,这个参数就是投影函数的返回值;如果没使用投影函数,就是一个包含所有源Observable最新值的数组。你写的subscribe((player, walls) => { ... })是错误的,因为回调不会拿到两个参数。
修正后的代码示例
这里给出两种正确的写法,你可以根据需求选择:
写法1:使用投影函数明确返回组合结果
Rx.Observable.combineLatest(player, walls, (playerCoords, wallsList) => { // 把两个Observable的最新值组合成一个对象返回 return { player: playerCoords, walls: wallsList }; }) .subscribe(result => { console.log('player', result.player); console.log('walls', result.walls); });
写法2:直接解构组合后的数组
如果不需要额外的投影处理,也可以直接接收combineLatest返回的数组,并用解构语法提取值:
Rx.Observable.combineLatest(player, walls) .subscribe(([playerCoords, wallsList]) => { console.log('player', playerCoords); console.log('walls', wallsList); });
额外提示:关于walls Observable的特性
你用range(1,10)生成的walls Observable会一次性发出10个墙的坐标,然后就进入完成状态。之后player每次触发新的坐标时,combineLatest会一直使用walls的最后一个值来组合。如果你的需求是持续生成新的墙,可能需要把range换成interval之类的持续流,但这是额外的优化点啦~
内容的提问来源于stack exchange,提问作者super.prozandr1

