Rxjs:zip两个长度不等的对象

Rxjs:zip两个长度不等的对象,rxjs,Rxjs,我想写两封信。 我试着拉上拉链,但它返回[6,9]、[10,8]、[40,4]、[33,2] let source1 = of(6, 10, 40, 33); let source2 = of(9, 8, 4, 2, 3); let final = zip(source1, source2); final.subscribe(x=>console.log(x)); 我的预期产出是[6,9],[10,8],[40,4],[33,2],“,”,3]。 我怎样才能用不相等的长度拉两个拉链 提前

我想写两封信。 我试着拉上拉链,但它返回[6,9]、[10,8]、[40,4]、[33,2]

let source1 = of(6, 10, 40, 33);
let source2 = of(9, 8, 4, 2, 3);
let final = zip(source1, source2);
final.subscribe(x=>console.log(x));
我的预期产出是[6,9],[10,8],[40,4],[33,2],“,”,3]。 我怎样才能用不相等的长度拉两个拉链


提前谢谢。

RxJS的
zip
功能只能合并已发生的可见光发射,当“最小”可见光停止发射时,它将停止发射。所以,你看到的是预期行为。最简单的解决方案是确保两个观测值的长度相同,例如,在
source1
的末尾添加
0
未定义的

let source1 = of(6, 10, 40, 33, 0);
let source2 = of(9, 8, 4, 2, 3);
let final = zip(source1, source2);
final.subscribe(x=>console.log(x));

如果你不能做到这一点,并且需要一个更复杂的解决方案,那么看看这个相关的问题:

RxJS的
zip
功能只能合并发生的可见光发射,当“最小”可见光停止发射时,它将停止。所以,你看到的是预期行为。最简单的解决方案是确保两个观测值的长度相同,例如,在
source1
的末尾添加
0
未定义的

let source1 = of(6, 10, 40, 33, 0);
let source2 = of(9, 8, 4, 2, 3);
let final = zip(source1, source2);
final.subscribe(x=>console.log(x));
如果您无法做到这一点,并且需要更复杂的解决方案,请查看以下相关问题:

let source1=of(6,10,40,33);
设source2=of(9,8,4,2,3);
让final=zip(source1,source2);
final.subscribe(x=>console.log(x));
我认为这在
zip
中是不可能的。它的工作方式是,对于每个提供的源,它将创建一个数组,该数组将添加到缓冲区中,这样,当源发射时,其值将添加到缓冲区中:

/**/
缓冲区[sourceIndex]。推送(值);
/* ... */
现在,为了使
zip
发出一个值数组,必须匹配以下条件:

/**/
if(buffers.every((buffer)=>buffer.length)){
/* ... */
换句话说,每个源的数组必须至少有一个值。当
source2
发出
3
时,情况并非如此


解决此问题的一种方法可能是使用
combinelateest

组合测试(
source1$.pipe(映射((v,idx)=>({v,idx})),
source2$.pipe(映射((v,idx)=>({v,idx})),
).烟斗(
扫描((前向、后向)=>{
const[prev1,prev2]=prevArr;
设[crt1,crt2]=crtArr;
//如果没有更新的值
prev1.idx==crt1.idx&&(crt1.v='');
prev2.idx==crt2.idx&&(crt2.v='');
返回[crt1,crt2];
}, [{}, {}]),
//过滤掉索引
map((arr)=>arr.map({v})=>v)),
开关图(
(估价师)=>of(估价师)。管道(
//如果数组不包含空字符串值,
//这意味着两个来源都释放出了新的东西
//如果是这样,那么我们应该立即发送值数组
//((obs$)=>obs$是标识函数)
//否则,我们使用'debounceTime(0)`等待源停止同步发送值
//或者根本不发送任何值
估价师每(v=>!!v)?(obs$)=>obs$:去BounceTime(0)
)
)
)
让source1=of(6,10,40,33);
设source2=of(9,8,4,2,3);
让final=zip(source1,source2);
final.subscribe(x=>console.log(x));
我认为这在
zip
中是不可能的。它的工作方式是,对于每个提供的源,它将创建一个数组,该数组将添加到缓冲区中,这样,当源发射时,其值将添加到缓冲区中:

/**/
缓冲区[sourceIndex]。推送(值);
/* ... */
现在,为了使
zip
发出一个值数组,必须匹配以下条件:

/**/
if(buffers.every((buffer)=>buffer.length)){
/* ... */
换句话说,每个源的数组必须至少有一个值。当
source2
发出
3
时,情况并非如此


解决此问题的一种方法可能是使用
combinelateest

组合测试(
source1$.pipe(映射((v,idx)=>({v,idx})),
source2$.pipe(映射((v,idx)=>({v,idx})),
).烟斗(
扫描((前向、后向)=>{
const[prev1,prev2]=prevArr;
设[crt1,crt2]=crtArr;
//如果没有更新的值
prev1.idx==crt1.idx&&(crt1.v='');
prev2.idx==crt2.idx&&(crt2.v='');
返回[crt1,crt2];
}, [{}, {}]),
//过滤掉索引
map((arr)=>arr.map({v})=>v)),
开关图(
(估价师)=>of(估价师)。管道(
//如果数组不包含空字符串值,
//这意味着两个来源都释放出了新的东西
//如果是这样,那么我们应该立即发送值数组
//((obs$)=>obs$是标识函数)
//否则,我们使用'debounceTime(0)`等待源停止同步发送值
//或者根本不发送任何值
估价师每(v=>!!v)?(obs$)=>obs$:去BounceTime(0)
)
)
)

您已经在这样做了。预期的行为是什么?没有返回[No],3]。您已经在执行此操作。预期的行为是什么?不返回[0],3]。